2011-12-02 10 views
6

Sto provando a produrre un documento XML utilizzando il pacchetto JDOM più recente. Ho problemi con l'elemento root e con gli spazi dei nomi. Ho bisogno di produrre questo elemento radice:Namespace (predefinito) in 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"> 

io uso questo codice:

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 

Tuttavia, l'elemento successivo dopo ManageBuildingsRequest ha lo spazio dei nomi di default pure, che rompe la convalida:

<customer xmlns=""> 

Qualsiasi aiuto? Grazie per il tuo tempo.

+0

potete inserire il codice generare il XML per favore? – GETah

risposta

15

Il utilizzato per l'elemento customer lo crea senza spazio dei nomi. È necessario utilizzare il costruttore con lo Namespace come parametro. È anche possibile riutilizzare lo stesso oggetto Namespace per entrambi gli elementi root e customer.

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

Hai ragione, ma non sono del tutto sicuro del perché. Devo passare lo spazio dei nomi ad ogni bambino che ho avuto un sacco di - è diventato piuttosto un dolore, ma questo è stato risolto. Grazie. – jn1kk

+0

@jsn Ran nello stesso problema e completamente d'accordo con te. Questa è una terribile API. Speravo di trovare una soluzione migliore. –

1

Ecco un approccio alternativo che implementa un XMLOutputProcessor personalizzato che salta emettono dichiarazioni di namespace vuote:

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

Il post potrebbe essere vecchio, ma questa è stata una soluzione elegante per un'API problematica. Grazie! – Didjit

0

ho provato il codice di javanna ma purtroppo continuava a generare gli spazi dei nomi vuoti nel contenuto del documento. Dopo aver provato il codice di bearontheroof, l'XML è stato esportato bene.

Si dovrebbe fare qualcosa di simile dopo aver creato la classe personalizzata:

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