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

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

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

我是否遗漏了一些东西,可以轻松地编写出与您使用 StAX 读入的文档非常相似的 XML 文档?

有帮助吗?

解决方案

StAX 工作得很好而且速度非常快。我在一个项目中使用它来解析最大 20MB 的 XML 文件。我没有进行彻底的分析,但它绝对比SAX快。

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

其他提示

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

(IE。javax.xml.stream.XMLEventReader 和 javax.xml.stream.XMLEventWriter)

也可以看看 http://www.devx.com/tips/Tip/37795, ,这最终让我感动。

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

XMLStreamWriter2.copyEventFromReader(XMLStreamReader2 r, boolean preserveEventData) 

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top