以下是尝试合并多个XML文件的代码。
public static void mergeXml(String directory) throws Exception {
File dir = new File(directory);
File[] rootFiles = dir.listFiles();
XMLEventWriter eventWriter;
XMLEventFactory eventFactory;
XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
eventWriter = outputFactory.createXMLEventWriter(new FileOutputStream("temp/testMerge1.xml"));
eventFactory = XMLEventFactory.newInstance();
// Create and write Start Tag
StartDocument startDocument = eventFactory.createStartDocument("ISO-8859-1");
eventWriter.add(startDocument);
for(File rootFile : rootFiles){
XMLEventReader test = inputFactory.createXMLEventReader(new StreamSource(rootFile));
while(test.hasNext()){
XMLEvent event= test.nextEvent();
//avoiding start(<?xml version="1.0"?>) and end of the documents;
if (event.getEventType()!= XMLEvent.START_DOCUMENT && event.getEventType() != XMLEvent.END_DOCUMENT)
eventWriter.add(event);
test.close();
}
eventWriter.add(eventFactory.createEndDocument());
eventWriter.close();
}
}
我遇到两个问题
[Fatal Error] :1:2493: The markup in the document following the root element must be well-formed.
org.xml.sax.SAXParseException: The markup in the document following the root element must be well-formed.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at SplitMain.validateInputFile(SplitMain.java:139)
at SplitMain.main(SplitMain.java:76)
答案 0 :(得分:1)
// Create and write Start Tag
StartDocument startDocument = eventFactory.createStartDocument("ISO-8859-1");
eventWriter.add(startDocument);
这不会为输出XML文档创建根元素,它只是编写<?xml
声明。在StartDocument
之后,您还需要添加合适的StartElement
:
StartElement startRootElt = eventFactory.createStartElement("", "http://example.com", "root");
eventWriter.add(startRootElt);
下一个问题是你正在关闭for循环中的eventWriter
:
eventWriter.add(eventFactory.createEndDocument());
eventWriter.close();
}
你需要将它移到for
循环之外,并结束我们从上面开始的根元素
}
eventWriter.add(eventFactory.createEndElement("", "http://example.com", "root"));
eventWriter.add(eventFactory.createEndDocument());
eventWriter.close();
此外,如果您的任何XML文件都有<!DOCTYPE
,则可能会遇到问题。您可能只能忽略DTD事件的方式与当前忽略开始和结束文档事件的方式相同,但这是否有效取决于该DTD中声明的内容。你必须尝试看看。
答案 1 :(得分:0)
我认为你的问题可能是你试图盲目地将XML节点添加到目标文档中,因此最终会有多个根元素。这在XML中是不允许的。
您可以在输出文档中创建一个新的顶级元素,然后将XML节点附加到该元素。