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