2009-08-18 7 views
4

Ich brauche eine XML-Datei in Java zu generieren, so wählte ich DOM zu verwenden (bis dort alles in Ordnung ist), hier ist der Root-Tag von dem, was ich schaffen mußJava DOM XML ist das Überspringen Xmlns Eigenschaften

<?xml version="1.0" encoding="utf-8"?> 
<KeyContainer Version="1.0" xmlns="urn:ietf:params:xml:ns:keyprov:pskc:1.0" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" xmlns:xml="http://www.w3.org/XML/1998/namespace"> 

hier ist meine Quellcode

PrintWriter out = new PrintWriter(path); 
Document xmldoc = null; 
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder = factory.newDocumentBuilder(); 
     DOMImplementation impl = builder.getDOMImplementation(); 
     Element e = null; 
     Node n = null; 
     xmldoc = impl.createDocument(null, "KeyContainer", null); 
     /* Noeuds non bouclés */ 
     Element keycontainer = xmldoc.getDocumentElement(); 
      keycontainer.setAttributeNS(null, "Version", "1.0"); 
      keycontainer.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:ds","http://www.w3.org/2000/09/xmldsig#"); 
      keycontainer.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xenc", "http://www.w3.org/2001/04/xmlenc#"); 
      keycontainer.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xml", "http://www.w3.org/XML/1998/namespace"); 
      keycontainer.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns", "urn:ietf:params:xml:ns:keyprov:pskc:1.0"); 
/* Non relevant Info*/ 
DOMSource domSource = new DOMSource(xmldoc); 
     StreamResult streamResult = new StreamResult(out); 
     TransformerFactory tf = TransformerFactory.newInstance(); 
     Transformer serializer = tf.newTransformer(); 
     serializer.setOutputProperty(OutputKeys.ENCODING,"utf-8"); 
     serializer.setOutputProperty(OutputKeys.VERSION,"1.0"); 
     serializer.setOutputProperty(OutputKeys.INDENT,"yes"); 
     serializer.setOutputProperty(OutputKeys.STANDALONE,"yes"); 
     serializer.transform(domSource, streamResult); 

und hier ist das, was ich

<?xml version="1.0" encoding="utf-8" standalone="no"?> 
<KeyContainer xmlns="" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" Version="1.0"> 

Problem ist die xmlns Eigenschaft leer ist, und xmln erhalten s: xml fehlt, was kann ich tun, um alle Informationen zu erhalten?

Vielen Dank Stackoverflow

(PS: Got NAMESPACE_ERR, wenn etwas anderes als "http://www.w3.org/2000/xmlns/" in NamespaceURI Feld)

Antwort

4

Zwei Dinge sind erforderlich, um xmlns=""

von der Document mit dem Erstellen loszuwerden gewünschter Namespace-URI als solcher:

xmldoc = impl.createDocument("urn:ietf:params:xml:ns:keyprov:pskc:1.0", "KeyContainer", null); 

Entfernen Sie die folgende Zeile als es ist jetzt nicht notwendig:

keycontainer.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns", "urn:ietf:params:xml:ns:keyprov:pskc:1.0"); 

In Bezug auf das xmlns:xml Attribut wird die API fällt es still. Siehe Zeile 173 von NamespaceMappings. Ein wenig Forschung zeigt, dass das Deklarieren dieses bestimmten Namensraums nicht definiert ist und nicht empfohlen wird.

+1

Danke, und gibt es einen Weg, nicht xmlns = "" in jedem Unterknoten zu bekommen? – Lliane

+0

Wie erstellen und fügen Sie sie hinzu? – laz

4

Um den DOM-Namespace zu aktivieren, vergessen Sie nicht, ihn in der DocumentBuilderFactory mit der Methode setNamespaceAware zu aktivieren.

+0

Die Namespace-Awareness wirkt sich nur darauf aus, wie vorhandene Dokumente analysiert werden (mit den 'Parse'-Methoden, die von' DocumentBuilder' definiert werden). Es hat keinerlei Auswirkungen auf programmatisch erzeugte DOM-Knoten (was das OP tut). –