【问题标题】:How to append XML (String) to XmlEventWriter (StAX) which already created the start of document如何将 XML(字符串)附加到已经创建文档开头的 XmlEventWriter(StAX)
【发布时间】:2017-03-05 02:19:30
【问题描述】:

为了创建大型 XML 文件,我们决定使用 StAX API。基本结构是使用低级 api 构建的:createStartDocument()、createStartElement()。这按预期工作。

但是,在某些情况下,我们喜欢附加现有的 XML 数据,这些数据位于字符串(从数据库中检索)中。下面的 sn-p 说明了这一点:

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:它附加了&lt;?xml version="1.0" ... &lt;fragments&gt;&lt;fragment&gt;... -> 这会导致无效的XML。

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

eventFactory.createCharacters(xml);

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

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

【问题讨论】:

    标签: java xml stax woodstox


    【解决方案1】:

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

    【讨论】:

    • 你是真正的救星!只知道它就在我面前O_o
    • 最后,我最终创建了一个 FilteredEventReader,因为我还必须跳过 EndDocument 事件。否则,它将关闭完整的 xml。
    • 使用这个例子我得到了这个异常 javax.xml.stream.XMLStreamException: No open start element, when trying to write end element
    猜你喜欢
    • 2021-08-30
    • 2021-01-05
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多