我目前正在尝试读取XML文件,进行一些小的更改(更改某些属性的值),然后再将其写回。
我打算使用StAX解析器(javax.xml.stream.XMLStreamReader
)来读取每个事件,看看它是否是我想要更改的,然后直接传递给StAX编写器(javax.xml.stream.XMLStreamReader
)如果不需要改变。
不幸的是,这看起来并不那么简单 - 作者无法获取事件类型和解析器对象,只有writeAttribute
和writeStartElement
等方法。很显然,我可以用一个可以在XML文档中出现的每种可能类型的元素的大小写一个大的switch语句,然后再把它写回来,但看起来它应该很简单似乎很麻烦
是否有一些我缺少的内容,可以很容易地将一个非常相似的XML文档写入您使用StAX读取的文档?
答案 0 :(得分:3)
经过一段时间的讨论后,答案似乎是使用事件读取器/写入器版本而不是Stream版本。
(即javax.xml.stream.XMLEventReader和javax.xml.stream.XMLEventWriter)
另见http://www.devx.com/tips/Tip/37795,这最终让我感动。
答案 1 :(得分:2)
StAX运行良好,速度非常快。我在一个项目中使用它来解析高达20MB的XML文件。我没有彻底的分析,但它肯定比SAX快。
至于你的问题:流媒体和事件处理之间的区别,AFAIK就是控制。使用流式API,您可以逐步浏览文档并获取所需的内容。而基于事件的API只能处理您感兴趣的内容。
答案 2 :(得分:2)
我知道这是一个相当古老的问题,但如果其他人正在寻找这样的东西,还有另一种选择:Woodstox Stax2扩展API有方法:
XMLStreamWriter2.copyEventFromReader(XMLStreamReader2 r, boolean preserveEventData)
使用流编写器从流阅读器复制当前指向的事件。这不仅简单而且非常有效。我已成功使用它进行类似的修改。
(如何获取XMLStreamWriter2等?所有Woodstox提供的实例都实现了这些扩展版本 - 如果有人想要使用“基本”Stax变体,还有包装器)