Pergunta

Eu preciso gerar um arquivo XML em Java, então eu escolhi para usar DOM (até que tudo está ok), aqui é a tag raiz do que eu preciso para criar

<?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">

Aqui está o meu código-fonte

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

E aqui está o que eu recebo

<?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">

O problema é que os xmlns propriedade é vazio, e xmlns:? Xml está faltando, o que posso fazer para obter todas as informações

Muito obrigado stackoverflow

(PS: Got NAMESPACE_ERR se algo mais do que " http://www.w3.org/ 2000 / xmlns / " no campo NamespaceURI)

Foi útil?

Solução

Duas coisas são necessárias para se livrar de xmlns=""

Criar a Document com o namespace desejado URI como tal:

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

Remova a seguinte linha como é agora desnecessária:

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

Em relação ao atributo xmlns:xml, a API é silenciosamente deixá-la cair. Veja a linha 173 do NamespaceMappings . Um pouco de pesquisa transforma-se que o comportamento de declarar que namespace particular é indefinido e não é recomendado.

Outras dicas

Para fazer DOM namespace ciente, não se esqueça de ativá-lo no DocumentBuilderFactory usando o método setNamespaceAware.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top