使用 StAX 对 XML 文档进行小修改

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

【参考方案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 变体)

【讨论】:

以上是关于使用 StAX 对 XML 文档进行小修改的主要内容,如果未能解决你的问题,请参考以下文章

JavaEE实战——XML文档DOMSAXSTAX解析方式详解

XML编程总结——目录

高级特性- XML

比较流行 java xml解析器有几种 名子是啥?

XML 试题

XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?