在Java中合并两个XML文件并添加额外信息

在Java中合并两个XML文件并添加额外信息,java,xml,merge,Java,Xml,Merge,我有两个XML文件,我想使用java将它们合并到最后的一个XML文件中 文件1的格式: <root> <a> <a>--include two lines under <a> <c/> </a> <d/> </root> --在下面包括两行 文件2的

我有两个XML文件,我想使用java将它们合并到最后的一个XML文件中

文件1的格式:

         <root>
          <a>
            <a>--include two lines under <a>
           <c/>
          </a>
            <d/> 
         </root>

--在下面包括两行
文件2的格式:

         <root>
          <a>
           <c/>
          </a>
            <d/> -- include 1 more line at the last
         </root>

--最后再加一行
谁能告诉我,在两个文件中添加特定信息后,如何合并这些文件

这就是我尝试过的,但它不能解决我的目的

                public class Xml {

               public static void main(String[] args) throws Exception {


              Writer output = null;
             output = new BufferedWriter(new FileWriter("H:\\merged_xml.xml"));
             String newline = System.getProperty("line.separator");
             output.write("<a>");

            // Read in xml file 1
            FileInputStream in = new FileInputStream("file1.xml");
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            String strLine;

           while ((strLine = br.readLine()) != null) {

           if (strLine.contains("<a>")){
           strLine = strLine.replace("<a>", "info to include");
            }
           if (strLine.contains("</a>")){
           strLine = strLine.replace("</a>", "info to include");
            }

           output.write(newline);
           output.write(strLine);

          System.out.println(strLine);
           }

          // Read in xml file 2
           FileInputStream in2 = new FileInputStream("file2.xml");
           BufferedReader br2 = new BufferedReader(new InputStreamReader(in2));
           String strLine2;

            while ((strLine2 = br2.readLine()) != null) {

             if (strLine2.contains("<d>")){
               strLine2 = strLine2.replace("<d>", "info to include");
              }

            output.write(strLine2);
            output.write(newline);
            System.out.println(strLine2);
           }

          output.write("</d>");
          output.close();

          System.out.println("Merge Complete");

              }

               }
公共类Xml{
公共静态void main(字符串[]args)引发异常{
写入器输出=空;
输出=新的缓冲写入程序(新的文件写入程序(“H:\\merged\u xml.xml”);
字符串newline=System.getProperty(“line.separator”);
输出。写入(“”);
//读入xml文件1
FileInputStream in=newfileinputstream(“file1.xml”);
BufferedReader br=新的BufferedReader(新的InputStreamReader(in));
弦斯特林;
而((strLine=br.readLine())!=null){
if(strLine.contains(“”){
strLine=strLine.replace(“,”要包含的信息“);
}
if(strLine.contains(“”){
strLine=strLine.replace(“,”要包含的信息“);
}
output.write(换行符);
输出。写入(strLine);
系统输出打印LN(斯特林);
}
//读入xml文件2
FileInputStream in2=新的FileInputStream(“file2.xml”);
BufferedReader br2=新的BufferedReader(新的InputStreamReader(in2));
字符串strLine2;
而((strLine2=br2.readLine())!=null){
if(strLine2.contains(“”){
strLine2=strLine2.replace(“,”要包含的信息“);
}
输出写入(strLine2);
output.write(换行符);
System.out.println(strLine2);
}
输出。写入(“”);
output.close();
System.out.println(“合并完成”);
}
}

您需要使用XML解析器来实现所需功能—无需使用Java IO类来读取和写入新文件。您可以使用流式XML解析器(google表示“JavaStax”)。如果使用javax.xml.stream库,您会发现XMLEventWriter有一个方便的方法XMLEventWriter#add(XMLEvent)。您所要做的就是循环每个文档中的顶级元素,并使用此方法将它们添加到编写器中,以生成合并结果。唯一有趣的部分是实现只考虑顶层节点(只调用“add”)的读卡器逻辑。

您需要使用XML解析器来实现您想要的功能—无需使用Java IO类来读写新文件。您可以使用流式XML解析器(google表示“JavaStax”)。如果使用javax.xml.stream库,您会发现XMLEventWriter有一个方便的方法XMLEventWriter#add(XMLEvent)。您所要做的就是循环每个文档中的顶级元素,并使用此方法将它们添加到编写器中,以生成合并结果。唯一有趣的部分是实现只考虑顶层节点(只调用“添加”)的读卡器逻辑。

尝试查看这篇讨论类似问题的文章-@Sonu:Thank U。。!但如何使用分隔符,以避免写入不需要的元素?对不起,我不明白您的意思。你能举个小例子吗?试试看这篇讨论类似问题的帖子-@Sonu:谢谢你。。!但如何使用分隔符,以避免写入不需要的元素?对不起,我不明白您的意思。你能举个小例子吗?试着阅读我之前发送的链接中的整个帖子。它有一个评论和几个例子。试试看,也许会有帮助。有人写了这样一句话——“除了使用Stax(这很有意义),使用StaxMate()可能会更容易。只需创建2个SMInputCursors,如果需要,还可以创建子游标。然后是带有两个游标的典型合并排序。类似于以递归下降的方式遍历DOM文档。请尝试读取我先前发送的链接中的整个帖子。它有一个评论和几个例子。试试看,也许会有帮助。有人写了这样一句话——“除了使用Stax(这很有意义),使用StaxMate()可能会更容易。只需创建2个SMInputCursors,如果需要,还可以创建子游标。然后是带有两个游标的典型合并排序。类似于以递归下降方式遍历DOM文档。”