【发布时间】:2018-09-18 13:59:30
【问题描述】:
示例 XML
<?xml version="1.0" encoding="UTF-8"?>
<Document>
<Report>
<Node>
<Detail>
<Id>1</Id>
<Value>Value 1</Value>
<Tag1>
<Owner>
<Id>
<INT>12345</INT>
</Id>
</Owner>
</Tag1>
</Detail>
<Status>
<Result>Pass</Result>
</Status>
</Node>
<Node>
<Detail>
<Id>2</Id>
<Value>Value 2</Value>
<Tag1>
<Owner>
<Id>
<String>TEST</String>
</Id>
</Owner>
</Tag1>
</Detail>
<Status>
<Result>Fail</Result>
</Status>
</Node>
<Node>
<Detail>
<Id>3</Id>
<Value>Value 3</Value>
<Tag1>
<Owner>
<Id>
<UN>UNKNOWN</UN>
</Id>
</Owner>
</Tag1>
</Detail>
<Status>
<Result>Waiting</Result>
</Status>
</Node>
</Report>
</Document>
基于上述结构,我想读取元素/属性并填充 POJO(最好是 XPath),因为元素路径不一致,例如:<Tag1>。
我不知道如何继续。我尝试过使用 AutoPilot,但它会按顺序读取数据,例如所有节点 ID。我想不出一种方法来读取<Node> 中的所有数据,然后继续下一个,依此类推。最后我需要返回填充的 POJO 集合。
DOM 超出范围,因为 XML 文件很大,大约 800MB 到 1GB 大小,大约 1GB。 600,000+ <Node>.
提前致谢。
XML 阅读器
public void process(final String fullPath) {
try {
final VTDGen vg = new VTDGen();
if (vg.parseFile(fullPath, false)) {
final VTDNav vn = vg.getNav();
final AutoPilot ap = new AutoPilot(vn);
ap.selectXPath(ROOT);
while ((ap.evalXPath()) != -1) {
final AutoPilot pilot1 = new AutoPilot(vn);
pilot1.selectXPath(ROOT + "/Detail/Id");
while (pilot1.evalXPath() != -1) {
final int t = vn.getText();
if (t != -1) {
System.out.println(vn.toNormalizedString(t));
}
final AutoPilot pilot2 = new AutoPilot(vn);
pilot2.selectXPath(ROOT + "/Status/Result");
if (pilot2.evalXPath() != -1) {
final int k = vn.getText();
if (k != -1) {
System.out.println(vn.toNormalizedString(k));
}
}
// pilot2.resetXPath();
}
}
}
}
catch (Exception exception) {
}
}
【问题讨论】:
-
您能否提供一个 pojo 示例和一些代码示例来说明您希望如何进行? Autopilot 可以轻松进行随机访问,这就是 vtd 的重点……它会从一个节点跳到另一个节点……
-
@vtd-xml-author 我已经包含了代码。我尝试了各种选项,但没有全部的副本。 POJO 是保存解析数据的普通 bean
-
我认为您正在尝试嵌套迭代,我将做一个示例,您可以适应您的情况...