Estou com o seguinte problema:
Na documentação da nota fiscal eletrônica são feitas duas exigências quanto a declaração de namespaces:
1 - Os namespaces/elementos não devem ter prefixos
2 - Cada elemento deve ser sua declaração de namespace individual
Essas exigências me obrigam a gerar um arquivo xml da seguinte forma:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<enviNFe xmlns="http://www.portalfiscal.inf.br/nfe">
<NFe xmlns="http://www.portalfiscal.inf.br/nfe"></NFe>
</enviNFe>
No entanto, devido aos elementos enviNFe e NFe estarem no mesmo namespace ao serializar o documento xml obtenho o seguinte resultado:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<enviNFe xmlns="http://www.portalfiscal.inf.br/nfe">
<NFe></NFe>
</enviNFe>
A ausência da declaração do namespace na tag faz com que o xml gerado seja considerado inválido.
Após debugar o código observei que no momento da serialização (classe: com.sun.org.apache.xml.internal.serializer.ToXMLStream) do atributo xmlns verifica-se a existência da declaração do namespace e portanto a declaração não é repetida.
Segue o código de exemplo:
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
dbFactory.setNamespaceAware(true);
DocumentBuilder builder = dbFactory.newDocumentBuilder();
Document doc = builder.newDocument();
doc.setXmlVersion("1.0");
Element parent = doc.createElement("enviNFe");
parent.setAttribute("xmlns", "http://www.portalfiscal.inf.br/nfe");
doc.appendChild(parent);
Element child = doc.createElement("NFe");
child.setAttribute("xmlns", "http://www.portalfiscal.inf.br/nfe");
parent.appendChild(child);
DOMSource domSrc = new DOMSource(doc);
StreamResult streamResult = new StreamResult(System.out);
TransformerFactory transformerFac = TransformerFactory.newInstance();
Transformer transformer = transformerFac.newTransformer();
transformer.transform(domSrc, streamResult);