使用 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
)是必需的。
不幸的是,这看起来并不那么简单 - 编写器无法获取事件类型和解析器对象,只能获取 writeAttribute
和 writeStartElement
之类的方法。显然,我可以为 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 文档进行小修改的主要内容,如果未能解决你的问题,请参考以下文章