如何将 XML (String) 附加到已经创建文档开头的 XmlEventWriter (StAX)
How to append XML (String) to XmlEventWriter (StAX) which already created the start of document
为了创建大 XML 文件,我们决定使用 StAX API。基本结构是使用低级 api 构建的:createStartDocument()、createStartElement()。这按预期工作。
但是,在某些情况下,我们喜欢附加驻留在字符串(从数据库中检索)中的现有 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:抛出以下异常:'Can not output XML declaration, after output has already been done'。 XMLEventReader 似乎以 startDocument 事件开始,但由于 startDocument 事件已经以编程方式触发,它会抛出错误。
- JDK:附加
<?xml version="1.0" ... <fragments><fragment>...
-> 导致无效 XML.
我还尝试使用以下方式附加 XML:
eventFactory.createCharacters(xml);
这里的问题是,即使附加了 XML,< 和 > 也会转换为 < 和 >。因此,这导致无效 XML.
我是否缺少一个 API 允许我简单地附加一个字符串作为 XML?
如有必要,您可以先使用任何 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);
为了创建大 XML 文件,我们决定使用 StAX API。基本结构是使用低级 api 构建的:createStartDocument()、createStartElement()。这按预期工作。
但是,在某些情况下,我们喜欢附加驻留在字符串(从数据库中检索)中的现有 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:抛出以下异常:'Can not output XML declaration, after output has already been done'。 XMLEventReader 似乎以 startDocument 事件开始,但由于 startDocument 事件已经以编程方式触发,它会抛出错误。
- JDK:附加
<?xml version="1.0" ... <fragments><fragment>...
-> 导致无效 XML.
我还尝试使用以下方式附加 XML:
eventFactory.createCharacters(xml);
这里的问题是,即使附加了 XML,< 和 > 也会转换为 < 和 >。因此,这导致无效 XML.
我是否缺少一个 API 允许我简单地附加一个字符串作为 XML?
如有必要,您可以先使用任何 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);