使用 stax 和 dom 读取大型 XML 文件
我需要读取几个大的(200Mb-500Mb)XML 文件,所以我想使用 StaX。 我的系统有两个模块 - 一个用于读取文件(使用 StaX);另一个模块(“解析器”模块)假设获取该 XML 的单个条目并使用 DOM 解析它。 我的 XML 文件没有特定的结构 - 所以我无法使用 JaxB。 如何向“解析器”模块传递我希望其解析的特定条目? 例如:
<Items>
<Item>
<name> .... </name>
<price> ... </price>
</Item>
<Item>
<name> .... </name>
<price> ... </price>
</Item>
</Items>
我想使用 StaX 来解析该文件 - 但每个“项目”条目都将传递到“解析器”模块。
编辑:
经过更多阅读后,我想我需要一个使用流读取 XML 文件的库,但使用 DOM 解析每个条目。有这样的事吗?
I need to read several big (200Mb-500Mb) XML files, so I want to use StaX.
My system has two modules - one to read the file ( with StaX ); another module ( 'parser' module ) suppose to get a single entry of that XML and parse it using DOM.
My XML files don't have a certain structure - so I cannot use JaxB.
How can I pass the 'parser' module a specific entry that I want it to parse?
For example:
<Items>
<Item>
<name> .... </name>
<price> ... </price>
</Item>
<Item>
<name> .... </name>
<price> ... </price>
</Item>
</Items>
I want to use StaX to parse that file - but each 'item' entry will be passed to the 'parser' module.
Edit:
After a little more reading - I think I need a library that reads an XML file using stream - but parse each entry using DOM. Is there such a thing?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以使用 StAX (
javax.xml.stream
) 解析器并将每个部分转换 (javax.xml.transform
) 为 DOM 节点 (org.w3c. dom
):另请参阅:
You could use a StAX (
javax.xml.stream
) parser and transform (javax.xml.transform
) each section to a DOM node (org.w3c.dom
):Also see:
由于 https://bugs.openjdk,Blaise Doughan 的答案在 clean java 7 和 8 中失败。 java.net/browse/JDK-8016914
有趣的事情:如果你使用 jaxb unmarshaller,你不会得到 NPE
:原因是:
com.sun.xml.internal.bind.v2.runtime.unmarshaller.StAXConnector$1
未实现Locator2
因此它没有getXMLVersion()< /代码>。
Blaise Doughan's answer fails in clean java 7 and 8 due to https://bugs.openjdk.java.net/browse/JDK-8016914
Funny thing: if you use jaxb unmarshaller, you don't get the NPE:
The reason is:
com.sun.xml.internal.bind.v2.runtime.unmarshaller.StAXConnector$1
does not implementLocator2
therefore it has nogetXMLVersion()
.您可以尝试使用 JLibs 中的 XMLDog。
它使用 SAX 评估 xml 文档上的 xpath(即不将整个 xml 加载到内存中)。
并返回被命中的节点的 dom 节点。
因此,您可以在您的 fat xml 文档上评估 xpath /Items/Item 。当每个 Item 节点被解析时,您将会收到通知。您可以处理当前的 Item dom 节点,然后继续。
因此它适合评估大型文档的 xpath
you can try XMLDog from JLibs.
It evaluates xpath on xml document using SAX (i.e without loading entire xml into memory).
and returns dom nodes for the nodes as they are hit.
thus you can evaluate xpath /Items/Item on your fat xml document. you will be notified as each Item node is parsed. you can process the current Item dom node, and continue.
Thus it is suitable for evaluating xpaths on large documents