好吧,直截了当。我使用java DOM将两个xml文档合并为一个。为此,我首先创建了一个新节点,将两个文档放在里面,使docs成为创建节点的子节点。父亲有两个属性,其中一个与我的一个xml文档相同。 属性为xmlns =" http://www.portalfiscal.inf.br/nfe"。 我不知道是否有一些xml规则但是child属性被隐藏了,只有父亲显示属性" xmlns"。
这是我得到的一段代码:
<?xml version="1.0" encoding="UTF-8"?>
-<nfeProc versao="3.10" xmlns="http://www.portalfiscal.inf.br/nfe">
-<NFe>
这就是我想要的:
<?xml version="1.0" encoding="UTF-8"?>
-<nfeProc xmlns="http://www.portalfiscal.inf.br/nfe" versao="3.10">
-<NFe xmlns="http://www.portalfiscal.inf.br/nfe">
这是我的代码:
public void juntarXML () {
File nota = new File("C:\\NotaFiscalEletronica.xml");
File protocolo = new File("C:\\Protocolo.xml");
//File xml = new File("C:\\xml.xml");
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = null;
Document docNota = null;
Document docProtocolo = null;
Document docXML = null;
try {
docBuilder = docFactory.newDocumentBuilder();
docNota = docBuilder.parse(nota);
docProtocolo = docBuilder.parse(protocolo);
docXML = docBuilder.newDocument();
docXML.setXmlVersion("1.0");
// Criando nó pai que conterá os dois documentos
Element nfeProc = docXML.createElement("nfeProc");
nfeProc.setAttribute("xmlns", "http://www.portalfiscal.inf.br/nfe");
nfeProc.setAttribute("versao", "3.10");
docXML.appendChild(nfeProc);
// Buscando e importando os nós dos documentos xml
NodeList list = docXML.getElementsByTagName("nfeProc");
Element listNode = (Element)list.item(0);
String chave = "chave";
for (int i=0; i<2; i++) {
NodeList list2;
Element list2Node;
if (i==0) {
list2 = docNota.getElementsByTagName("NFe"); // Nota Fiscal
list2Node = (Element)list2.item(0);
}else {
list2 = docProtocolo.getElementsByTagName("protNFe"); // Protocolo
list2Node = (Element)list2.item(0);
chave = list2Node.getChildNodes().item(0).getChildNodes().item(2).getTextContent(); // Recuperando a chave
}
Node importedNode = docXML.importNode(list2Node, true);
listNode.appendChild(importedNode);
}
TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer trans = transFactory.newTransformer();
trans.setOutputProperty(OutputKeys.INDENT, "yes");
DOMSource source = new DOMSource(docXML);
StreamResult result = new StreamResult(new StringWriter());
trans.transform(source, result);
Writer output = new BufferedWriter(new FileWriter("C:\\" + chave + ".xml"));
String xmlOutput = result.getWriter().toString();
//System.out.println(xmlOutput);
output.write(xmlOutput);
output.close();
}catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我曾尝试重新创建节点的属性&#34; NFe&#34;而且没有结果。 我已经检查过该属性是否仍然存在且确实存在。当我把它放入xml文档时它就消失了。
那么,有一种方法可以展示它吗?
借此机会,在&#34; nfeProc&#34;的情况下,我可以设置一些东西不按字母顺序排列属性,保持我添加它们的顺序吗?
从现在开始,我感谢你的关注。
答案 0 :(得分:0)
DOM的两个XML是相同的。后代继承命名空间定义,直到它们被重新定义。
因此,XML序列化程序应优化XML并仅保留所需的命名空间定义。这意味着......
<?xml version="1.0" encoding="UTF-8"?>
<nfeProc versao="3.10" xmlns="http://www.portalfiscal.inf.br/nfe">
<NFe>
...
...是预期的XML文档。这里没有理由在子元素上使用相同的命名空间定义。
此外,使用createElementNS()
- createElement()
的名称空间感知变体。这应该根据需要自动添加xmlns属性。