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?
你是一個真正的實時保護!只是爲了知道這是正確的在我面前O_o – Quirexx
最後,我最終創建了一個FilteredEventReader,因爲我也不得不跳過EndDocument事件。否則,它會關閉完整的xml。 – Quirexx
使用這個例子我總是得到這個異常javax.xml.stream.XMLStreamException:當試圖寫入結束元素時沒有打開開始元素 –