2012-11-27 87 views
0

以下是試圖合併合併多個XML文件的代碼。合併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) 
+0

如果檢測到文件編碼不正確,則格式錯誤的xml錯誤也可能出現。特別是如果它包含非拉丁字符。 – svz

回答

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中聲明的內容。你必須嘗試看看。

+0

thanx一噸伊恩......被困在dis 2天... thanx再:) – user1643087

0

我認爲你的問題可能是你試圖盲目地將XML節點添加到目標文檔中,從而最終導致多個根元素。這在XML中是不允許的。

您可以在輸出文檔中創建一個新的頂級元素,並將XML節點附加到該元素上。

+0

好的..我會嘗試和標記它是正確的,如果它運作出來 – user1643087