【问题标题】:Small modification to an XML document using StAX使用 StAX 对 XML 文档进行小修改
【发布时间】:2010-09-05 20:26:36
【问题描述】:

我目前正在尝试读入一个 XML 文件,进行一些小的更改(更改某些属性的值),然后再次将其写回。

我打算使用 StAX 解析器 (javax.xml.stream.XMLStreamReader) 读取每个事件,看看它是否是我想要更改的,然后如果没有更改则直接将其传递给 StAX 编写器 (javax.xml.stream.XMLStreamReader)是必需的。

不幸的是,这看起来并不那么简单 - 编写器无法获取事件类型和解析器对象,只能获取 writeAttributewriteStartElement 之类的方法。显然,我可以为 XML 文档中可能出现的每种可能类型的元素编写一个带有 case 的大 switch 语句,然后再次将其写回,但对于看起来应该很简单的事情来说,这似乎很麻烦.

我是否遗漏了什么可以轻松写出与您使用 StAX 读取的 XML 文档非常相似的 XML 文档?

【问题讨论】:

    标签: java xml stax


    【解决方案1】:

    经过一番折腾,答案似乎是使用事件读取器/写入器版本而不是流版本。

    (即 javax.xml.stream.XMLEventReader 和 javax.xml.stream.XMLEventWriter)

    另请参阅http://www.devx.com/tips/Tip/37795,这是最终让我感动的原因。

    【讨论】:

      【解决方案2】:

      StAX 运行良好且速度非常快。我在一个项目中使用它来解析最大 20MB 的 XML 文件。我没有彻底的分析,但它肯定比 SAX 快。

      至于您的问题:流式处理和事件处理之间的区别,AFAIK 是控制。使用流式 API,您可以逐步浏览文档并获取所需的内容。而基于事件的 API 您只能处理您感兴趣的内容。

      【讨论】:

        【解决方案3】:

        我知道这是一个相当老的问题,但如果其他人正在寻找类似的东西,还有另一种选择:Woodstox Stax2 扩展 API 有方法:

        XMLStreamWriter2.copyEventFromReader(XMLStreamReader2 r, boolean preserveEventData) 
        

        它使用流写入器从流读取器复制当前指向的事件。这不仅简单而且非常有效。我已经成功地使用它进行了类似的修改。

        (如何获取 XMLStreamWriter2 等?所有 Woodstox 提供的实例都实现了这些扩展版本——另外还有包装器,以防有人也想使用“基本”Stax 变体)

        【讨论】:

          猜你喜欢
          • 2020-11-07
          • 2015-06-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多