2017-03-05 56 views
1

爲了創建大型XML文件,我們決定使用StAX API。基本結構是通過使用低級別的API創建的:createStartDocument(),createStartElement()。這按預期工作。如何將XML(字符串)附加到已創建文檔開頭的XmlEventWriter(StAX)

但是,在某些情況下,我們希望追加駐留在String中的現有XML數據(從數據庫中檢索)。下面的代碼片段說明了這一點:

import java.lang.*; 
import java.io.*; 
import javax.xml.stream.*; 

public class Example { 
    public static void main(String... args) throws XMLStreamException { 
     XMLOutputFactory outputFactory = XMLOutputFactory.newInstance(); 
     XMLInputFactory inputFactory = XMLInputFactory.newInstance(); 
     XMLEventFactory eventFactory = XMLEventFactory.newInstance(); 

     StringWriter writer = new StringWriter(); 
     XMLEventWriter eventWriter = outputFactory.createXMLEventWriter(writer); 

     eventWriter.add(eventFactory.createStartDocument("UTF-8", "1.0")); 
     eventWriter.add(eventFactory.createStartElement("ns0", "http://example.org", "root")); 
     eventWriter.add(eventFactory.createNamespace("ns0", "http://example.org")); 

     //In here, we want to append a piece of XML which is stored in a string variable. 
     String xml = "<fragments><fragment><data>This is pure text.</data></fragment></fragments>"; 
     eventWriter.add(inputFactory.createXMLEventReader(new StringReader(xml))); 

     eventWriter.add(eventFactory.createEndDocument()); 

     System.out.println(writer.toString()); 
    } 
} 

與上面的代碼,根據不同的實現中,我們沒有得到預期的結果:

  • Woodstox:以下拋出異常:「無法輸出XML聲明,輸出完成後'。看起來XMLEventReader從startDocument事件開始,但由於startDocument事件已經以編程方式觸發,它會引發錯誤。
  • JDK:它追加<?xml version="1.0" ... <fragments><fragment>... - >這導致無效的XML。

我還試圖通過使用要追加XML:

eventFactory.createCharacters(xml); 

這裏的問題是,即使XML被附加,則<和>被轉換成& lt和& GT。因此,這導致無效的XML。

我錯過了一個API,它允許我簡單地追加一個字符串作爲XML?

回答

2

你可以先消耗必要時對任意StartDocument:

String xml = "<fragments><fragment><data>This is pure text.</data></fragment></fragments>"; 
    XMLEventReader xer = inputFactory.createXMLEventReader(new StringReader(xml)); 
    if (xer.peek().isStartDocument()) 
    { 
     xer.nextEvent(); 
    } 
    eventWriter.add(xer); 
+0

你是一個真正的實時保護!只是爲了知道這是正確的在我面前O_o – Quirexx

+0

最後,我最終創建了一個FilteredEventReader,因爲我也不得不跳過EndDocument事件。否則,它會關閉完整的xml。 – Quirexx

+0

使用這個例子我總是得到這個異常javax.xml.stream.XMLStreamException:當試圖寫入結束元素時沒有打開開始元素 –