0

这是我试图合并合并多个 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();
    }

}

我遇到了两个问题

  1. 输出文件没有任何编码
  2. 当我试图解析此代码创建的文件时,出现以下异常

[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)
4

2 回答 2

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);

下一个问题是您正在关闭eventWriterfor 循环内部:

    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 中声明的确切内容。你得试试看。

于 2012-11-27T12:48:21.440 回答
0

我认为您的问题可能是您试图盲目地将 XML 节点添加到目标文档中,因此最终会得到多个根元素。这在 XML 中是不允许的。

您可以在输出文档中创建一个新的顶级元素,并将 XML 节点附加到该元素。

于 2012-11-27T12:23:52.003 回答