我如何从一个巨大的 xml 文件(比如 5gb)中读取单个标签,我不需要来自 xml 的其他数据。Stax 方法是正确的吗?考虑示例 xml
<tag1>
<tag2>
<tag3>
<tag4>
.
.
.
.
.
.
.
<balance>12121</balance>
.
.
.
.
.
.
</tag4>
</tag3>
</tag2>
</tag1>
提前致谢
我如何从一个巨大的 xml 文件(比如 5gb)中读取单个标签,我不需要来自 xml 的其他数据。Stax 方法是正确的吗?考虑示例 xml
<tag1>
<tag2>
<tag3>
<tag4>
.
.
.
.
.
.
.
<balance>12121</balance>
.
.
.
.
.
.
</tag4>
</tag3>
</tag2>
</tag1>
提前致谢
很大程度上取决于找到您要查找的元素的难易程度。如果您想要名称为“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']
但是提供流媒体的产品往往要花钱。
在这种情况下,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