6

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

我打算使用 StAXjavax.xml.stream.XMLStreamReader解析器javax.xml.stream.XMLStreamReader

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

有没有什么我遗漏的东西可以很容易地写出一个与你用 StAX 读到的非常相似的 XML 文档?

4

3 回答 3

4

经过一番折腾,答案似乎是使用事件读取器/写入器版本而不是流版本。

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

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

于 2008-08-14T04:13:24.717 回答
3

StAX 运行良好且速度非常快。我在一个项目中使用它来解析最大 20MB 的 XML 文件。我没有彻底的分析,但它肯定比 SAX 快。

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

于 2008-08-14T05:52:27.730 回答
2

我知道这是一个相当老的问题,但如果其他人正在寻找这样的东西,还有另一种选择:Woodstox Stax2 扩展 API 有方法:

XMLStreamWriter2.copyEventFromReader(XMLStreamReader2 r, boolean preserveEventData) 

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

(如何获得 XMLStreamWriter2 等?所有 Woodstox 提供的实例都实现了这些扩展版本——另外还有包装器,以防有人也想使用“基本”Stax 变体)

于 2010-08-10T20:12:44.567 回答