【问题标题】:XMLStreamException when writing a XML file写入 XML 文件时出现 XMLStreamException
【发布时间】:2012-10-18 22:38:41
【问题描述】:

在我使用此代码使用 StAX 编写 XML 文件之前:

 // Create a XMLOutputFactory
 XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
 // Create XMLEventWriter
 XMLEventWriter eventWriter = outputFactory
        .createXMLEventWriter(new FileOutputStream(behaviorsFilePath));
 // Create a EventFactory
 XMLEventFactory eventFactory = XMLEventFactory.newInstance();
 XMLEvent end = eventFactory.createDTD("\n");
 // Create and write Start Tag
 StartDocument startDocument = eventFactory.createStartDocument();
 eventWriter.add(startDocument);
 eventWriter.add(end);
 eventWriter.add(end);

 // Create config open tag
 StartElement configStartElement = eventFactory.createStartElement("",
          "", ROOT);
//...

这段代码运行良好,但现在它抛出了一个javax.xml.stream.XMLStreamException: Trying to write multiple DOCTYPE declarations 异常。

在调试应用的时候,可以看到第二次调用时抛出异常:eventWriter.add(end);

为什么这段代码以前有效,现在无效?

更新:

我不确定这是否真的很重要,但这段代码在 SwingWorker 线程中运行...

我所做的唯一可能有问题的修改是我在项目中添加了库以使用 Axis2 Web 服务(其中之一是:geronimo-stax-api_1.0_spec-1.0.1.jar)...我看到了this

速度 - Axis2 使用自己的对象模型和 StAX(XML 流式 API)解析来实现比早期版本的 Apache Axis 更快的速度。

还有this:

stax-api-1.0.1.jar(包含 javax.xml.namespace.QName 类的 StAX API。此 jar 可以替换为包含 javax.xml.namespace.QName 实现的任何其他 jar。但是Axis2 使用 Axis2 发行版捆绑的 stax-api-1.0.1.jar 中的此类)

【问题讨论】:

    标签: java stax


    【解决方案1】:

    因为,就像异常已经告诉你的那样,你是“Trying to write multiple DOCTYPE declarations”。为什么你的代码有两次eventWriter.add(end);

    【讨论】:

    • 因为我想在 xml 中添加一个空行...正如我所说的,这在以前有效...
    • 但是你为什么要使用 createDTD 呢?这根本不是它的用途。如果您阅读了文档:woodstox.codehaus.org/javadoc/stax-api/1.0/javax/xml/stream/… 它清楚地说明了 createDTD:“创建文档类型定义事件此字符串包含与 XML 1.0 规范中的 doctypedecl 匹配的整个文档类型声明”
    • 所以看来你的更新有一个更严格(和正确)的 XMLEventWriter.add() 实现。
    • 我建议改用createSpace()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 2011-10-19
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    相关资源
    最近更新 更多