2011-12-02 21 views
6

Estoy intentando producir un documento XML utilizando el paquete JDOM más nuevo. Tengo problemas con el elemento raíz y los espacios de nombres. Necesito para producir este elemento raíz:Espacios de nombres (predeterminado) en JDOM

<ManageBuildingsRequest 
    xmlns="http://www.energystar.gov/manageBldgs/req" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.energystar.gov/manageBldgs/req 
         http://estar8.energystar.gov/ESES/ABS20/Schemas/ManageBuildingsRequest.xsd"> 

utilizo este código:

Element root = new Element("ManageBuildingsRequest"); 
root.setNamespace(Namespace.getNamespace("http://www.energystar.gov/manageBldgs/req")); 
Namespace XSI = Namespace.getNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 
root.addNamespaceDeclaration(XSI); 
root.setAttribute("schemaLocation", "http://www.energystar.gov/manageBldgs/req http://estar8.energystar.gov/ESES/ABS20/Schemas/ManageBuildingsRequest.xsd", XSI); 

Element customer = new Element("customer"); 
root.addContent(customer); 
doc.addContent(root); // doc jdom Document 

Sin embargo, el siguiente elemento después de ManageBuildingsRequest tiene el nombre por defecto, así, que rompe la validación:

<customer xmlns=""> 

¿Alguna ayuda? Gracias por tu tiempo.

+0

Se puede publicar el código XML generar su favor? – GETah

Respuesta

15

El constructor que está utilizando para el elemento customer lo crea sin espacio de nombre. Debería usar el constructor con el Namespace como parámetro. También puede reutilizar el mismo objeto Namespace para los elementos raíz y de cliente.

Namespace namespace = Namespace.getNamespace("http://www.energystar.gov/manageBldgs/req"); 
Element root = new Element("ManageBuildingsRequest", namespace); 
Namespace XSI = Namespace.getNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 
root.addNamespaceDeclaration(XSI); 
root.setAttribute("schemaLocation", "http://www.energystar.gov/manageBldgs/req http://estar8.energystar.gov/ESES/ABS20/Schemas/ManageBuildingsRequest.xsd", XSI); 

Element customer = new Element("customer", namespace); 
root.addContent(customer); 
doc.addContent(root); // doc jdom Document 
+2

Tienes razón, pero no estoy muy seguro de por qué. Tengo que pasar el espacio de nombres a cada niño que tuve mucho, se convirtió en un gran dolor, pero esto lo solucionó. Gracias. – jn1kk

+0

@jsn Se encontró con el mismo problema y totalmente de acuerdo con usted. Esta es una terrible API. Estaba esperando encontrar una mejor solución. –

1

Aquí es un enfoque alternativo que implementa un XMLOutputProcessor personalizado que salta emisión de declaraciones de espacios vacíos:

public class CustomXMLOutputProcessor extends AbstractXMLOutputProcessor { 
    protected void printNamespace(Writer out, FormatStack fstack, Namespace ns) 
      throws java.io.IOException { 
     System.out.println("namespace is " + ns); 
     if (ns == Namespace.NO_NAMESPACE) { 
      System.out.println("refusing to print empty namespace"); 
      return; 
     } else { 
      super.printNamespace(out, fstack, ns); 
     } 
    } 
} 
+0

La publicación puede ser antigua, pero esta fue una solución bastante elegante para una API problemática. ¡Gracias! – Didjit

0

me trataron código de javanna pero desafortunadamente fue generando los espacios de nombres vacíos en el contenido del documento. Después de probar el código de bearontheroof, el XML se exportó muy bien.

Usted tendría que hacer algo como esto después de crear la clase personalizada:

CustomXMLOutputProcessor output = new CustomXMLOutputProcessor(); 
output.process(new FileWriter("/path/to/folder/generatedXML.xml"), Format.getPrettyFormat(), document);