如何使用java DOM显示/隐藏xml属性?

时间:2015-04-08 16:36:38

标签: java xml

好吧,直截了当。我使用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;的情况下,我可以设置一些东西不按字母顺序排列属性,保持我添加它们的顺序吗?

从现在开始,我感谢你的关注。

1 个答案:

答案 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属性。