views:

1224

answers:

2

Hi there, I need to generate an xml file in Java, so I chose to use DOM (until there everything is ok), here is the root tag of what i need to create

<?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"&gt;

Here is my source code

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);

And here is what I get

<?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 is the xmlns property is empty, and xmlns:xml is missing, what can I do to get all information ?

Thanks a lot stackoverflow

(PS : Got NAMESPACE_ERR if anything else than "http://www.w3.org/2000/xmlns/" in NamespaceURI field)

+2  A: 

Two things are required to get rid of xmlns=""

Create the Document with the desired namespace URI as such:

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

Remove the following line as it is now unnecessary:

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

Regarding the xmlns:xml attribute, the API is silently dropping it. See line 173 of NamespaceMappings. A bit of research turns up that the behavior of declaring that particular namespace is undefined and is not recommended.

laz
Thanks, and is there any way not to get xmlns="" in every subnodes ?
Lliane
How are you creating and adding them?
laz
+1  A: 

To make DOM namespace aware, do not forget to enable it in the documentbuilderfactory using the setNamespaceAware method.

Paul de Vrieze