XML将多个XML合并到一个新的XML文件中



我试图将多个XML合并到骨架XML文件中以创建一个新的XML文件。我正在尝试创建一个循环以包含多个XML并合并为一个XML。我正在尝试这样的事情,但它不起作用:file dir = new文件(" e: temp "(; file [] rootfiles = dir.listfiles((;到目前为止,我无法使用单个XML创建正确的XML。任何帮助将不胜感激。

这是我的XML输入的代码:

 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setValidating(false);
    DocumentBuilder db = dbf.newDocumentBuilder();
    File file = new File("Result.xml");

        String baseXml = "E:\IntelliJ\TryXml\src\blank.xml";
        String inputXmls = "E:\IntelliJ\TryXml\src\input1.xml";
        Document doc1 = db.parse(baseXml);
        Document doc2 = db.parse(inputXmls);
        NodeList nList = doc1.getElementsByTagName("Configs");
        Element element = (Element) nList.item(0);
        Node copiedNode = doc2.importNode(element, true);
        doc2.getDocumentElement().appendChild(copiedNode);
        processXml(doc2, file);
}
private static void processXml(Document xml, File file) throws TransformerException {
    Transformer tf = TransformerFactory.newInstance().newTransformer();
    tf.setOutputProperty(OutputKeys.INDENT,"yes");
    tf.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
    tf.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,"yes");
    DOMSource source = new DOMSource(xml);
    StreamResult result = new StreamResult(file);
    tf.transform(source,result);
}

XML文件

input1.xml

<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0">
    <Configs>
        <Config name="test1">
            <title>Title 1</title>
            <author>Author1</author>
        </Config>
        <Config name="test2">
            <title>Title 2</title>
            <author>Author2</author>
        </Config>
    </Configs>
    <optional>I dont want this to be copied</optional>
    <Ratings>
        <body>
            <Items name = "object 1">
                <something1>something1</something1>
            </Items>
        </body>
    </Ratings>
</rss>

input2.xml

<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0">
    <Configs>
        <Config name="test3">
            <title>Title 3</title>
            <author>Author3</author>
        </Config>
        <Config name="test4">
            <title>Title 4</title>
            <author>Author4</author>
        </Config>
    </Configs>
    <optional>I dont want this to be copied</optional>
    <Ratings>
        <body>
            <Items name = "object 2">
                <something1>something2</something1>
            </Items>
        </body>
    </Ratings>
</rss>

blank.xml(骨架xml我将根据标签插入元素(

<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0">
    <Configs>
    </Configs>
    <Ratings>
        <body>
        </body>
    </Ratings>
</rss>

这就是我得到的

result.xml

<rss version="2.0">
    <Configs>
        <Config name="test1">
            <title>Title 1</title>
            <author>Author1</author>
        </Config>
        <Config name="test2">
            <title>Title 2</title>
            <author>Author2</author>
        </Config>
    </Configs>
    <optional>I dont want this to be copied</optional>
    <Ratings>
        <body>
            <Items name="object 1">
                <something1>something1</something1>
            </Items>
        </body>
    </Ratings>
<Configs>
    </Configs>
</rss>

这就是我需要的

 <?xml version="1.0" encoding="utf-8" ?>
    <rss version="2.0">
    <Configs>
            <Config name="test1">
                <title>Title 1</title>
                <author>Author1</author>
            </Config>
            <Config name="test2">
                <title>Title 2</title>
                <author>Author2</author>
            </Config>
            <Config name="test3">
                <title>Title 3</title>
                <author>Author3</author>
            </Config>
            <Config name="test4">
                <title>Title 4</title>
                <author>Author4</author>
            </Config>
        </Configs>
        <Ratings>
            <body>
                <Items name="object 1">
                    <something1>something1</something1>
                </Items>
                <Items name="object 2">
                    <something1>something2</something1>
                </Items>
            </body>
        </Ratings>
    </rss>

更新这就是我没有标签之间的更新值。

之间的更新值。

这就是我将项目定义为Nodelist

的方式
NodeList itemsNodeList = inputDoc.getElementsByTagName("Items");

<rss version="2.0">
    <Configs>
    <Config name="test1">
            <title>Title 1</title>
            <author>Author1</author>
        </Config>
<Config name="test2">
            <title>Title 2</title>
            <author>Author2</author>
        </Config>
<Config name="test3">
            <title>Title 3</title>
            <author>Author3</author>
        </Config>
<Config name="test4">
            <title>Title 4</title>
            <author>Author4</author>
        </Config>
</Configs>
    <Ratings>
        <body>
        <Items name="object 1">
                <something1>something1</something1>
            </Items>
<Items name="object 2">
                <something1>something2</something1>
            </Items>
</body>
    </Ratings>
</rss>

java解决方案:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setValidating(false);
DocumentBuilder db = dbf.newDocumentBuilder();
File file = new File("Result.xml");
String baseXml = "blank.xml";
String[] inputXmls = {"input1.xml","input2.xml"};
Document resultDoc = db.parse(baseXml);
Node resultConfigsNode = resultDoc.getElementsByTagName("Configs").item(0);
Node resultRatingsBodyNode = resultDoc.getElementsByTagName("body").item(0);
for (String inputXml : inputXmls){
    Document inputDoc = db.parse(inputXml);
    NodeList configNodeList = inputDoc.getElementsByTagName("Config");
    for (int i = 0; i < configNodeList.getLength(); i++) {
        Node copiedNode = resultDoc.importNode(configNodeList.item(i), true);
        resultConfigsNode.appendChild(copiedNode);
    }
    for (int i = 0; i < itemsNodeList.getLength(); i++) {
        Node copiedNode = resultDoc.importNode(itemsNodeList.item(i), true);
        NamedNodeMap attrMap = copiedNode.getAttributes();
        Node n = attrMap.getNamedItem("name");
        if(n.getNodeValue().equals("object 1")){
            System.out.println("Items object 1");
        }
        resultRatingsBodyNode.appendChild(copiedNode);
    }
    NodeList valueNodeList = inputDoc.getElementsByTagName("value");
    for (int i = 0; i < valueNodeList.getLength(); i++) {
        Node copiedNode = resultDoc.importNode(valueNodeList.item(i), true);
        Text txt = (Text) copiedNode.getFirstChild();
        txt.setData("NewValue");
        resultRatingsBodyNode.appendChild(copiedNode);
    }
}
processXml(resultDoc, file);

使用XSLT作为此类工作,这将使您的生活更加轻松(可以轻松从Java调用XSLT(。以Blank.xml作为主要输入文档,可以在XSLT 3.0中这样完成(使用1.0或2.0,并且不难(:

<xsl:transform version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:param name="input1" select="doc('input1.xml')"/>
<xsl:param name="input2" select="doc('input2.xml')"/>
<xsl:template match="Configs">
  <xsl:copy>
     <xsl:copy-of select="$input1//Config, $input2//Config"/>
  </xsl:copy>
</xsl:template>
<xsl:template match="body">
  <xsl:copy>
     <xsl:copy-of select="$input1//Items, $input2//Items"/>
  </xsl:copy>
</xsl:template>
</xsl:transform>

最新更新