关于java:使用StAX对XML文档进行小的修改

关于java:使用StAX对XML文档进行小的修改

Small modification to an XML document using StAX

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

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

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

我是否缺少某些东西,可以轻松编写出与您用StAX读取的XML文档非常相似的XML文档?


经过一番摸索之后,答案似乎是使用事件读取器/写入器版本而不是Stream版本。

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

另请参阅http://www.devx.com/tips/Tip/37795,这最终使我感动。


StAX可以很好地工作并且非常快。我在一个项目中使用它来解析最大20MB的XML文件。我没有详尽的分析,但是绝对比SAX快。

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


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

1
XMLStreamWriter2.copyEventFromReader(XMLStreamReader2 r, boolean preserveEventData)

使用流编写器从流阅读器复制当前指向的事件。这不仅简单而且非常有效。我已经成功地将其用于类似的修改。

(如何获取XMLStreamWriter2等?所有Woodstox提供的实例都实现了这些扩展版本-加上包装,以防有人也希望使用"基本" Stax变体)。


推荐阅读