Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Xml将多个Xml合并到一个新的Xml文件中_Java_Xml_Dom_Jaxb - Fatal编程技术网

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

Java Xml将多个Xml合并到一个新的Xml文件中,java,xml,dom,jaxb,Java,Xml,Dom,Jaxb,我正在尝试将多个xml合并到一个框架xml文件中,以创建一个新的xml文件。我正在尝试创建一个循环来包含多个xml并合并到一个xml中。我正在尝试类似的东西,但它不起作用 :File dir=新文件(“E:\temp\”; File[]rootFiles=dir.listFiles(); 到目前为止,我无法用单个xml创建正确的xml。任何帮助都将不胜感激 以下是我的单xml输入代码: DocumentBuilderFactory dbf = DocumentBuilderFactory.ne

我正在尝试将多个xml合并到一个框架xml文件中,以创建一个新的xml文件。我正在尝试创建一个循环来包含多个xml并合并到一个xml中。我正在尝试类似的东西,但它不起作用 :File dir=新文件(“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>

标题1
作者1
标题2
作者2
我不想这被复制
有些事
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>

标题3
作者3
标题4
作者4
我不想这被复制
什么
blank.xml(骨架xml,我将根据标记插入元素)


这就是我得到的

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>

标题1
作者1
标题2
作者2
我不想这被复制
有些事
这就是我需要的

 <?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>

标题1
作者1
标题2
作者2
标题3
作者3
标题4
作者4
有些事
什么
更新 这是我在标记之间没有更新值的情况下得到的

这就是我如何将这些项定义为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>
nodelistitemsnodelist=inputDoc.getElementsByTagName(“Items”);
标题1
作者1
标题2
作者2
标题3
作者3
标题4
作者4
有些事
什么

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


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);
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
dbf.setValidating(false);
DocumentBuilder db=dbf.newDocumentBuilder();
File File=新文件(“Result.xml”);
String baseXml=“blank.xml”;
字符串[]inputXmls={“input1.xml”,“input2.xml”};
documentresultdoc=db.parse(baseXml);
节点resultConfigsNode=resultDoc.getElementsByTagName(“配置”)。项(0);
节点resultingsbodynode=resultDoc.getElementsByTagName(“body”).item(0);
for(字符串inputXml:inputXmls){
文档inputDoc=db.parse(inputXml);
NodeList configNodeList=inputDoc.getElementsByTagName(“配置”);
对于(int i=0;i
我认为主要的问题是您使用doc2文档进行修改(创建结果)而不是doc1(空白)以及逻辑中的其他问题您还需要Java解决方案吗?是的,仍在寻找Java解决方案。谢谢谢谢你,迈克尔。我们可以合并n个XML文件而不仅仅是2或5个文件吗?在合并过程中,我是否能够将值(如to或Author4)更改为Author10?我不太熟悉XSLT,我将尝试一下。谢谢你的帮助!!是的,所有这些都是可能的。如果你在做这些事情时有特殊的问题,那么就在一个新的帖子上问一个特殊的问题。太棒了,非常感谢。这就是我要找的。如果我有更多的项目,比如something1 someValue,我必须将someValue的值更改为NewValue,我如何更新它?我可以引用Items name=“object 1”并更新我找到的第一个值标记内的值吗?请参阅更新版本,并举例说明如何将SomeValue的值更改为NewValue并引用Items name=“object 1”Hello Sergey,我尝试了更新的代码,但没有更新标记内的值。我已经更新了我的结果。@404或505嗨!4.请查收我对你感激不尽。。这就是我需要的。出于某种原因,我在寻找标签而不是标签。非常感谢你的帮助!!
<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>
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);