java - 如何将 XML(字符串)附加到已创建文档开头的 XmlEventWriter (StAX)

标签 java xml stax woodstox

为了创建大型 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:抛出以下异常:“输出已经完成后,无法输出 XML 声明”。 XMLEventReader 似乎是从 startDocument 事件开始的,但由于 startDocument 事件已经以编程方式触发,因此它会抛出错误。
  • JDK:它附加 <?xml version="1.0" ... <fragments><fragment>... -> 这会导致无效的 XML。

我还尝试使用以下方法附加 XML:

eventFactory.createCharacters(xml);

这里的问题是,即使附加了 XML,< 和 > 也会转换为 < 和 >。因此,这会导致无效的 XML。

我是否缺少一个允许我简单地将字符串附加为 XML 的 API?

最佳答案

如果需要,您可以首先使用任何 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);

关于java - 如何将 XML(字符串)附加到已创建文档开头的 XmlEventWriter (StAX),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42603731/

相关文章:

android - 具有用于定位的可选/条件关系的 RelativeLayout

java - stax xml 与 getname 函数混淆

java.net.MalformedURLException - 在通过 StAX 解析 XML 文件时

java - 如何从遵循特定格式的字符串中删除未知字符?

java - 使用具有特殊字符的正则表达式标记字符串

java - 如何使用 XStream 将同名节点反序列化为两个不同的类

java - 使用 StAX 为 XML 创建索引以便快速访问

Java 等同于 Cocoa NSNotification?

java - 提示用户从数组中选择元素以获取用户信息

php - 如何制作 "empty"RSS 提要