【发布时间】:2015-09-28 13:41:59
【问题描述】:
我有很大的、非常嵌套的 XML 文件。所有实体和属性都将成为我的对象变量。我正在创建此类对象的列表。我知道如何用 DOM、SAX 和 XMLPullParser 来做这件事,它工作得很好,但我对 VTD 解析器有问题。解析后的ListView为空。我将 XML 文件的一部分和我的代码放在下面。也许有人知道我做错了什么。
<MedlineCitationSet>
<MedlineCitation Owner="NLM" Status="MEDLINE">
<PMID Version="1">10540283</PMID>
<DateCreated>
<Year>1999</Year>
<Month>12</Month>
<Day>17</Day>
</DateCreated>
<Article PubModel="Print">
<Journal>
<ISSN IssnType="Print">0950-382X</ISSN>
<JournalIssue CitedMedium="Print">
<Volume>34</Volume>
<Issue>1</Issue>
</JournalIssue>...
我的安卓代码:
try {
articlesList = new ArrayList<>();
VTDGen vtdGen = new VTDGen();
vtdGen.setDoc(bytes);
vtdGen.parse(false);
AutoPilot ap = new AutoPilot();
VTDNav vtdNav = vtdGen.getNav();
int i = -1;
ap.bind(vtdNav);
ap.selectXPath("/MedlineCitationSet/MedlineCitation");
while ((ap.evalXPath()) != -1) {
articlesList.add(new Article());
String year = null, day = null, month = null;
i++;
if (vtdNav.hasAttr("Owner"))
articlesList.get(i).setOwner(vtdNav.toNormalizedString(vtdNav.getAttrVal("Owner")));
if (vtdNav.hasAttr("Status"))
articlesList.get(i).setStatus(vtdNav.toNormalizedString(vtdNav.getAttrVal("Status")));
vtdNav.push();
AutoPilot ap1 = new AutoPilot();
ap1.selectXPath("/MedlineCitationSet/MedlineCitation/PMID");
ap1.bind(vtdNav);
while ((ap1.evalXPath()) != -1) {
articlesList.get(i).setPMID(vtdNav.toNormalizedString(vtdNav.getText()));
articlesList.get(i).setVersion(vtdNav.toNormalizedString(vtdNav.getAttrVal("Version")));
}
ap1.resetXPath();
ap1.selectXPath("/MedlineCitationSet/MedlineCitation/DateCreated");
ap1.bind(vtdNav);
while ((ap1.evalXPath() != -1)) {
vtdNav.push();
AutoPilot ap1x = new AutoPilot();
ap1x.selectXPath("/MedlineCitationSet/MedlineCitation/DateCreated/Year");
ap1x.bind(vtdNav);
while ((ap1x.evalXPath()) != -1) {
year = vtdNav.toNormalizedString(vtdNav.getText());
}
ap1x.resetXPath();
ap1x.selectXPath("/MedlineCitationSet/MedlineCitation/DateCreated/Month");
ap1x.bind(vtdNav);
while ((ap1x.evalXPath()) != -1) {
month = vtdNav.toNormalizedString(vtdNav.getText());
}
ap1x.resetXPath();
ap1x.selectXPath("/MedlineCitationSet/MedlineCitation/DateCreated/Day");
ap1x.bind(vtdNav);
while ((ap1x.evalXPath()) != -1) {
day = vtdNav.toNormalizedString(vtdNav.getText());
}
articlesList.get(i).setDateCreated(day + "-" + month + "-" + year);
vtdNav.pop();
}
ap1.resetXPath();
ap1.selectXPath("/MedlineCitationSet/MedlineCitation/Article");
ap1.bind(vtdNav);
while ((ap1.evalXPath()) != -1) {
if (vtdNav.hasAttr("Print"))
articlesList.get(i).setPubModel(vtdNav.toNormalizedString(vtdNav.getAttrVal("Print")));
vtdNav.push();
AutoPilot ap2 = new AutoPilot();
ap2.selectXPath("/MedlineCitationSet/MedlineCitation/Article/Journal");
ap2.bind(vtdNav);
{
vtdNav.push();
AutoPilot ap2x = new AutoPilot();
ap2x.selectXPath("/MedlineCitationSet/MedlineCitation/Article/Journal/ISSN");
ap2x.bind(vtdNav);
while ((ap2x.evalXPath()) != -1) {
articlesList.get(i).setISSN(vtdNav.toNormalizedString(vtdNav.getText()));
articlesList.get(i).setIssnType(vtdNav.toNormalizedString(vtdNav.getAttrVal("IssnType")));
}
ap2x.resetXPath();
ap2x.selectXPath("/MedlineCitationSet/MedlineCitation/Article/Journal/JournalIssue");
ap2x.bind(vtdNav);
while ((ap2x.evalXPath()) != -1) {
articlesList.get(i).setCitedMedium(vtdNav.toNormalizedString(vtdNav.getAttrVal("CitedMedium")));
vtdNav.push();
AutoPilot ap3 = new AutoPilot();
ap3.selectXPath("/MedlineCitationSet/MedlineCitation/Article/Journal/JournalIssue/Volume");
ap3.bind(vtdNav);
while ((ap3.evalXPath()) != -1) {
articlesList.get(i).setVolume(vtdNav.toNormalizedString(vtdNav.getText()));
}
ap3.resetXPath();
ap3.selectXPath("/MedlineCitationSet/MedlineCitation/Article/Journal/JournalIssue/Issue");
ap3.bind(vtdNav);
while ((ap3.evalXPath()) != -1) {
articlesList.get(i).setIssue(vtdNav.toNormalizedString(vtdNav.getText()));
}
ap3.resetXPath();
vtdNav.pop();
}...
感谢您的帮助!
【问题讨论】:
-
您尝试做的事情似乎很复杂,涉及多个嵌套的 xpath 表达式。你能先从概念上描述你想做的事情吗?
-
我正在比较 4 个解析器的性能:XMLPullParser、DOM、SAX 和 VTD-XML。互联网上几乎没有 VTD-XML 解析器的示例,我对此有很大的问题。
-
VTD-XML 2.11 版本包含很多处理简单用例的示例。 VTD-XML 网站本身有一些示例。网站上也有文章和参考资料。您正在执行的任务非常复杂,似乎是一个经验丰富的 vtd-xml 开发人员的工作......让我知道我可以如何帮助你......
-
使用其他解析器似乎要困难得多。明天我会尝试使用下面的示例,我会告诉你的。感谢您的帮助!
-
它的学习曲线和其他任何东西一样。但是 vtd-xml 的目标是让简单任务或复杂任务尽可能简单……尤其是与 SAX 和 PULL 进行比较时
标签: java android xpath arraylist vtd-xml