2017-03-05 58 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:当试图写入结束元素时没有打开开始元素 –