在 Java 中:
假设我有3个xml文件
<student>lin</student> -- file1.xml
<student>Eric</student> -- file2.xml
<student>joe</student> -- file3.xml
如何合并这些xml(考虑到它们没有DTD或名称空间声明)来创建
<class><student>lin</student> <student>Eric</student>
<student>joe</student> </class> -- file4.xml
class 是我手动提供的包装节点
Ps :我使用xstream创建了xml的
答案 0 :(得分:2)
我的文件很大我会使用 SAXParser ,ContentHandler会回显标签和内容。
像(伪代码):
print("<class>")
foreach(file in files)
{
mysaxparser.parse(new Handler()
{
content="";
void endElement(tag)
{
if(tag.equals("student")) print("<student>"+escapeXML(content)+"</student>");
content="";
}
void characters(str)
{
content+=str;
}
},file);
}
print("</class>");
如果您的文件足够小以适应内存:使用DocumentBuilder加载每个文档的DOM并调用importNode将文档合并为一个。
答案 1 :(得分:1)
如果您知道每个文件都是格式良好的,您可以将它们连接在一起(从它们中删除任何prolog条目后),以及包含根元素开始和结束标记的页眉和页脚。
String[] filenames = new String[]{"header.xml", "file1.xml", "file2.xml", "file3.xml", "footer.xml"};
OutputStream outputStream = new BufferedOutputStream(new FileOutputStream("merged.xml");
for (String filename : filenames) {
InputStream inputStream = new BufferedInputStream(new FileInputStream(filename);
org.apache.commons.io.IOUtils.copy(inputStream, outputStream);
inputStream.close();
}
outputStream.close();
答案 2 :(得分:1)
我认为正确的方法是将三个文件加载到DOM文档中,然后让其中一个文件采用其他两个文档中的节点,这样一切都由dom api处理,并且应该是万无一失的,而不是文本操作。
您可以通过查看DomDocument javadoc来实现此目的。