0

我如何从一个巨大的 xml 文件(比如 5gb)中读取单个标签,我不需要来自 xml 的其他数据。Stax 方法是正确的吗?考虑示例 xml

<tag1>
<tag2>
<tag3>
<tag4>
.
.
.
.
.
.
.
<balance>12121</balance>
.
.
.
.
.
.
</tag4>
</tag3>
</tag2>
</tag1>

提前致谢

4

3 回答 3

0

很大程度上取决于找到您要查找的元素的难易程度。如果您想要名称为“balance”的唯一(或第一个)元素,那么使用 SAX 或 StAX 都非常容易。(StAX 可能更容易一些,但不要使用 JDK 附带的 StAX 解析器,使用 Woodstox)。

如果更难识别您想要的元素,那么使用具有流功能的 XSLT/XPath/XQuery 引擎会更好。例如,Saxon XQuery 将允许您执行

saxon:stream('big-file.xml')//balance[@account-nr='012345' and @date='2015-08-25']

但是提供流媒体的产品往往要花钱。

于 2015-08-27T08:08:08.383 回答
0

如果您正在处理一个巨大的 xml 文件,则需要使用 SAX 解析器,而不是 DOM 解析器。查看本教程和Oracle 页面

Dom 解析器 - 读取整个文档并在内存中创建结构,它们可以像地图一样使用,因此很容易检查是否存在任何元素等。但它对大数据无效。

另一方面,Sax 是事件驱动的解析器,您实现读取标签的方法,然后读取标签等。它是一个迭代算法,不使用太多资源。

于 2015-08-27T07:09:32.163 回答
0

在这种情况下,Oracle 的用于 Java 的 XQuery 处理器也可以流式传输。这是文档中有关流式传输的部分:http: //docs.oracle.com/database/121/ADXDK/adx_j_xqj.htm#ADXDK190

例如:

declare variable $mydata external;
$mydata//balance

而且,如果您设置实体解析器,也可以使用 fn:doc。例如:

doc("mydata.xml")//balance

这也将流式传输。参见示例 7-14: http ://docs.oracle.com/database/121/ADXDK/adx_j_xqj.htm#ADXDK112

于 2015-08-31T14:55:29.830 回答