如何通过Java StAX XMLEventReader的迭代器模式高效遍历XML文档?
- 内容介绍
- 相关推荐
本文共计946个文字,预计阅读时间需要4分钟。
因为 +next()+ 不做空值检查,它假定你已经确认还有事件可读——这与 +Iterator+ 的约定一致,但容易在循环末尾误用。常见错误是写成 +while (reader.hasNext()) { event=reader.next(); ... } 后,又多调用一次 +next()+ (例如想执行类似 peek 的操作)。结果越界。
- 正确姿势:只用
hasNext()+next()配对,且每次next()前必须确保hasNext()返回true - 安全替代:改用
nextEvent()(返回当前事件并移动)或peek()(只看不移动),它们在流末尾返回null,不抛异常 - 注意:
next()和remove()都是Iterator接口方法,但 StAX 实现中remove()总是抛UnsupportedOperationException,别碰
XMLEventReader 读到 START_ELEMENT 后怎么取属性值
不能直接 cast 成 StartElement 就完事——得先确认类型,再用 getAttributeByName() 或遍历 getAttributes()。
本文共计946个文字,预计阅读时间需要4分钟。
因为 +next()+ 不做空值检查,它假定你已经确认还有事件可读——这与 +Iterator+ 的约定一致,但容易在循环末尾误用。常见错误是写成 +while (reader.hasNext()) { event=reader.next(); ... } 后,又多调用一次 +next()+ (例如想执行类似 peek 的操作)。结果越界。
- 正确姿势:只用
hasNext()+next()配对,且每次next()前必须确保hasNext()返回true - 安全替代:改用
nextEvent()(返回当前事件并移动)或peek()(只看不移动),它们在流末尾返回null,不抛异常 - 注意:
next()和remove()都是Iterator接口方法,但 StAX 实现中remove()总是抛UnsupportedOperationException,别碰
XMLEventReader 读到 START_ELEMENT 后怎么取属性值
不能直接 cast 成 StartElement 就完事——得先确认类型,再用 getAttributeByName() 或遍历 getAttributes()。

