将XML节点作为独立XML文档处理,并更新原始XML文档中的节点

时间:2016-12-30 18:42:27

标签: java xml xslt dom

我需要将XML节点作为独立XML处理,向Node Document添加新标签,使用新节点信息更新原始XML文档。欢迎任何帮助,建议或指导。

这是原始的XML:

    <ENVOLVENTE id="ENVOLVENTE">
<FirmaEmpresa>
    <FirmaDonante>
        <Firma>
            <Relacion>
                <RelacionId>32490342093249090234</RelacionId>
            </Relacion>
            <Formulario>
                <Donante>
                    <DonanteNombre>Gloria Robles</DonanteNombre>
                    <DonanteCorreo>gloria@gmail.com</DonanteCorreo>
                </Donante>
                <Beneficiado>
                    <BeneficiarioPais>USA</BeneficiarioPais>
                    <BeneficiadoCorreo>usdonations@gmail.com</BeneficiadoCorreo>
                </Beneficiado>
                <Fabricantes>
                    <Fabricante>
                        <FabricanteNumeroOrden>1</FabricanteNumeroOrden>
                        <FabricantePais>MX</FabricantePais>
                        <FabricanteCorreo>fabricante@gmail.com</FabricanteCorreo>
                    </Fabricante>
                </Fabricantes>
                <ListaDonaciones>
                    <Donaciones>
                        <DonacionesNumeroOrden>1</DonacionesNumeroOrden>
                        <DonacionesProductoId>nombre</DonacionesProductoId>
                        <DonacionesCantidadDonada>100</DonacionesCantidadDonada>
                        <DonacionesFechaDonacion>2016-12-29T12:21:16</DonacionesFechaDonacion>
                    </Donaciones>
                </ListaDonaciones>
            </Formulario>
        </Firma>
    </FirmaDonante>
    <Empresa>
        <EmpresaPais>MX</EmpresaPais>
        <EmpresaNombre>Donaciones A.C </EmpresaNombre>
        <EmpresaDirecccion>AV. REFORMA 1900</EmpresaDirecccion>
        <EmpresaCiudad>CDXM</EmpresaCiudad>
    </Empresa>
    <PermisoEmpresa>
        <PermisoNumero>329023409324902349023409234</PermisoNumero>
    </PermisoEmpresa>
</FirmaEmpresa>
</ENVOLVENTE>

现在,我需要提取节点&#34; FirmaDonante&#34;到一个新的XML DOM:

 <FirmaDonante>
        <Firma>
            <Relacion>
                <RelacionId>32490342093249090234</RelacionId>
            </Relacion>
            <Formulario>
                <Donante>
                    <DonanteNombre>Gloria Robles</DonanteNombre>
                    <DonanteCorreo>gloria@gmail.com</DonanteCorreo>
                </Donante>
                <Beneficiado>
                    <BeneficiarioPais>USA</BeneficiarioPais>
                    <BeneficiadoCorreo>usdonations@gmail.com</BeneficiadoCorreo>
                </Beneficiado>
                <Fabricantes>
                    <Fabricante>
                        <FabricanteNumeroOrden>1</FabricanteNumeroOrden>
                        <FabricantePais>MX</FabricantePais>
                        <FabricanteCorreo>fabricante@gmail.com</FabricanteCorreo>
                    </Fabricante>
                </Fabricantes>
                <ListaDonaciones>
                    <Donaciones>
                        <DonacionesNumeroOrden>1</DonacionesNumeroOrden>
                        <DonacionesProductoId>nombre</DonacionesProductoId>
                        <DonacionesCantidadDonada>100</DonacionesCantidadDonada>
                        <DonacionesFechaDonacion>2016-12-29T12:21:16</DonacionesFechaDonacion>
                    </Donaciones>
                </ListaDonaciones>
            </Formulario>
        </Firma>
    </FirmaDonante>

之后,我将修改节点作为新的XML文档,类似于此,在原始节点之后使用新的XML元素。

        <FirmaDonante>
        <Firma>
            <Relacion>
                <RelacionId>32490342093249090234</RelacionId>
            </Relacion>
            <Formulario>
                <Donante>
                    <DonanteNombre>Gloria Robles</DonanteNombre>
                    <DonanteCorreo>gloria@gmail.com</DonanteCorreo>
                </Donante>
                <Beneficiado>
                    <BeneficiarioPais>USA</BeneficiarioPais>
                    <BeneficiadoCorreo>usdonations@gmail.com</BeneficiadoCorreo>
                </Beneficiado>
                <Fabricantes>
                    <Fabricante>
                        <FabricanteNumeroOrden>1</FabricanteNumeroOrden>
                        <FabricantePais>MX</FabricantePais>
                        <FabricanteCorreo>fabricante@gmail.com</FabricanteCorreo>
                    </Fabricante>
                </Fabricantes>
                <ListaDonaciones>
                    <Donaciones>
                        <DonacionesNumeroOrden>1</DonacionesNumeroOrden>
                        <DonacionesProductoId>nombre</DonacionesProductoId>
                        <DonacionesCantidadDonada>100</DonacionesCantidadDonada>
                        <DonacionesFechaDonacion>2016-12-29T12:21:16</DonacionesFechaDonacion>
                    </Donaciones>
                </ListaDonaciones>
            </Formulario>
        </Firma>
    </FirmaDonante>
    <Signature>
            <SignedInfo/>
            <KeyInfo/>
    </Signature>

最后,我需要将Node文档添加到原始文档中的相同位置,如Node,并使用新标记:

    <ENVOLVENTE id="ENVOLVENTE">
<FirmaEmpresa>
    <FirmaDonante>
        <Firma>
            <Relacion>
                <RelacionId>32490342093249090234</RelacionId>
            </Relacion>
            <Formulario>
                <Donante>
                    <DonanteNombre>Gloria Robles</DonanteNombre>
                    <DonanteCorreo>gloria@gmail.com</DonanteCorreo>
                </Donante>
                <Beneficiado>
                    <BeneficiarioPais>USA</BeneficiarioPais>
                    <BeneficiadoCorreo>usdonations@gmail.com</BeneficiadoCorreo>
                </Beneficiado>
                <Fabricantes>
                    <Fabricante>
                        <FabricanteNumeroOrden>1</FabricanteNumeroOrden>
                        <FabricantePais>MX</FabricantePais>
                        <FabricanteCorreo>fabricante@gmail.com</FabricanteCorreo>
                    </Fabricante>
                </Fabricantes>
                <ListaDonaciones>
                    <Donaciones>
                        <DonacionesNumeroOrden>1</DonacionesNumeroOrden>
                        <DonacionesProductoId>nombre</DonacionesProductoId>
                        <DonacionesCantidadDonada>100</DonacionesCantidadDonada>
                        <DonacionesFechaDonacion>2016-12-29T12:21:16</DonacionesFechaDonacion>
                    </Donaciones>
                </ListaDonaciones>
            </Formulario>
        </Firma>
    </FirmaDonante>
    <!--NEW TAG -->
    <Signature>
            <SignedInfo/>
            <KeyInfo/>
    </Signature>
    <!--NEW TAG -->
    <Empresa>
        <EmpresaPais>MX</EmpresaPais>
        <EmpresaNombre>Donaciones A.C </EmpresaNombre>
        <EmpresaDirecccion>AV. REFORMA 1900</EmpresaDirecccion>
        <EmpresaCiudad>CDXM</EmpresaCiudad>
    </Empresa>
    <PermisoEmpresa>
        <PermisoNumero>329023409324902349023409234</PermisoNumero>
    </PermisoEmpresa>
</FirmaEmpresa>
</ENVOLVENTE>

实际上,我可以提取节点,但是当我尝试在节点文档中添加新元素时我有错误:

            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setNamespaceAware(true);

        DocumentBuilder builder = dbf.newDocumentBuilder();
        InputStream stream = new ByteArrayInputStream(
                xmlFile.getBytes(StandardCharsets.UTF_8));
        Document document = builder.parse(stream);


         Element elementFirmaDonante =  (Element) document.getElementsByTagName("FirmaDonante").item(0);



        DocumentBuilder documentBuilder = dbf.newDocumentBuilder();       
        Document documentoCODExporterMasEH = documentBuilder.newDocument();


        Node newNode = documentoCODExporterMasEH.importNode(elementFirmaDonante, true);
        documentoCODExporterMasEH.appendChild(newNode);



        /*In this point all is OK, a can serialize de Document, but now, a can't add a new Item to the node document*/


        /*
         * This block, throws error:
         * HIERARCHY_REQUEST_ERR: An attempt was made to insert a node where it is not permitted.
         */
        Element anotherElement =  (Element) document.getElementsByTagName("Empresa").item(0);
        Node anotherNewNode = documentoCODExporterMasEH.importNode(anotherElement, true);
        documentoCODExporterMasEH.insertBefore(anotherNewNode, newNode);

上面的代码只是为了测试我可以向DOM对象添加新的元素或节点。

有什么建议吗?

提前致谢!!!!!

1 个答案:

答案 0 :(得分:1)

参见下面的代码,我能够在Empresa节点之前插入一个新节点: -

Element anotherElement  = (Element)document.getElementsByTagName("Empresa").item(0);
    Element newTag = document.createElement("Signature");
    Element childElem1=document.createElement("SignedInfo");
    Element childElem2=document.createElement("KeyInfo");
    newTag.appendChild(childElem1);newTag.appendChild(childElem2);
    anotherElement.getParentNode().insertBefore(newTag, anotherElement);

尝试更改您的代码,如下所示: -

documentoCODExporterMasEH.insertBefore(newNode,anotherNewNode);