使用StAX对XML文档进行小的修改
我目前正在尝试读取XML文件,进行一些小的更改(更改某些属性的值),然后再次写回。
我打算使用StAX解析器(javax.xml.stream.XMLStreamReader
)在每个事件中读取,看是否是我要更改的事件,然后将其直接传递给StAX编写器(javax.xml .stream.XMLStreamReader
)(如果不需要更改)。
不幸的是,这看起来并不那么简单。作者无法采用事件类型和解析器对象,只能采用诸如writeAttribute和writeStartElement之类的方法。显然,我可以为XML文档中可能出现的每种可能类型的元素编写一个带有条件的大switch语句,然后再次将其写回,但是对于看起来应该很简单的事情来说似乎很麻烦。
有什么我想念的东西可以使写出与我们用StAX读到的非常相似的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具有方法:
XMLStreamWriter2.copyEventFromReader(XMLStreamReader2 r, boolean preserveEventData)
使用流编写器从流阅读器复制当前指向的事件。这不仅简单而且非常有效。我已经成功地将其用于类似的修改。
(如何获取XMLStreamWriter2等?所有Woodstox提供的实例都实现了这些扩展版本,此外,还有包装器,以防有人想要使用"基本" Stax变体)