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

}

2つの問題が発生しています

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

eventWriter次の問題は、for ループの内側を閉じていることです。

    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 に答える