Java 如何使用VTD-XML解析器将嵌套的XML文件元素放入对象列表?
我有一个很大的嵌套XML文件。所有实体和属性都将成为我的对象变量。我正在创建此类对象的列表。我知道如何使用DOM、SAX和XMLPullParser来实现这一点,它工作得很好,但我在使用VTD解析器时遇到了问题。解析后的ListView为空。下面是XML文件的一部分和我的代码。也许有人知道我做错了什么Java 如何使用VTD-XML解析器将嵌套的XML文件元素放入对象列表?,java,android,xpath,arraylist,vtd-xml,Java,Android,Xpath,Arraylist,Vtd Xml,我有一个很大的嵌套XML文件。所有实体和属性都将成为我的对象变量。我正在创建此类对象的列表。我知道如何使用DOM、SAX和XMLPullParser来实现这一点,它工作得很好,但我在使用VTD解析器时遇到了问题。解析后的ListView为空。下面是XML文件的一部分和我的代码。也许有人知道我做错了什么 <MedlineCitationSet> <MedlineCitation Owner="NLM" Status="MEDLINE"> <PMID Versi
<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>...
10540283
1999
12
17
0950-382X
34
1.
...
我的android代码:
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();
}...
试试看{
articlesList=新的ArrayList();
VTDGen VTDGen=新VTDGen();
vtdGen.setDoc(字节);
解析(false);
自动驾驶仪ap=新自动驾驶仪();
VTDNav VTDNav=vtdGen.getNav();
int i=-1;
ap.bind(vtdNav);
ap.选择XPath(“/medline引证集/medline引证”);
而((ap.evalXPath())!=-1){
ArticleList.add(新文章());
字符串year=null,day=null,month=null;
i++;
如果(vtdNav.hasAttr(“所有者”))
articlesList.get(i).setOwner(vtdNav.toNormalizedString(vtdNav.getAttrVal(“所有者”));
如果(vtdNav.hasAttr(“状态”))
articlesList.get(i).setStatus(vtdNav.toNormalizedString(vtdNav.getAttrVal(“状态”));
vtdNav.push();
自动驾驶仪ap1=新自动驾驶仪();
ap1.选择XPath(“/medline引文集/medline引文/PMID”);
ap1.bind(vtdNav);
而((ap1.evalXPath())!=-1){
articlesList.get(i).setPMID(vtdNav.toNormalizedString(vtdNav.getText());
articlesList.get(i.setVersion(vtdNav.toNormalizedString(vtdNav.getAttrVal(“Version”);
}
ap1.resetXPath();
ap1.选择XPath(“/medline引证集/medline引证/DateCreated”);
ap1.bind(vtdNav);
而((ap1.evalXPath()!=-1)){
vtdNav.push();
自动驾驶仪ap1x=新自动驾驶仪();
ap1x.selectXPath(“/medline引证集/medline引证/DateCreated/Year”);
ap1x.bind(vtdNav);
而((ap1x.evalXPath())!=-1){
year=vtdNav.toNormalizedString(vtdNav.getText());
}
ap1x.resetXPath();
ap1x.selectXPath(“/medline引证集/medline引证/DateCreated/Month”);
ap1x.bind(vtdNav);
而((ap1x.evalXPath())!=-1){
month=vtdNav.toNormalizedString(vtdNav.getText());
}
ap1x.resetXPath();
ap1x.selectXPath(“/medline引证集/medline引证/DateCreated/Day”);
ap1x.bind(vtdNav);
而((ap1x.evalXPath())!=-1){
day=vtdNav.toNormalizedString(vtdNav.getText());
}
articlesList.get(i).setDateCreated(日+“-”+月+“-”+年);
vtdNav.pop();
}
ap1.resetXPath();
ap1.选择XPath(“/medline引文集/medline引文/文章”);
ap1.bind(vtdNav);
而((ap1.evalXPath())!=-1){
如果(vtdNav.hasAttr(“打印”))
articlesList.get(i).setPubModel(vtdNav.toNormalizedString(vtdNav.getAttrVal(“打印”));
vtdNav.push();
自动驾驶仪ap2=新自动驾驶仪();
ap2.选择XPath(“/medline引文集/medline引文/文章/期刊”);
ap2.bind(vtdNav);
{
vtdNav.push();
自动驾驶仪ap2x=新自动驾驶仪();
ap2x.selectXPath(“/medline引证集/medline引证/Article/Journal/ISSN”);
ap2x.bind(vtdNav);
而((ap2x.evalXPath())!=-1){
articlesList.get(i.setISSN(vtdNav.toNormalizedString(vtdNav.getText());
articlesList.get(i).SetIsNtype(vtdNav.toNormalizedString(vtdNav.getAttrVal(“IsNtype”));
}
ap2x.resetXPath();
ap2x.选择XPath(“/medline引文集/medline引文/文章/期刊/日志”);
ap2x.bind(vtdNav);
而((ap2x.evalXPath())!=-1){
articlesList.get(i).setCitedMedium(vtdNav.toNormalizedString(vtdNav.getAttrVal(“CitedMedium”));
vtdNav.push();
自动驾驶仪ap3=新自动驾驶仪();
ap3.选择XPath(“/medline引文集/medline引文/文章/期刊/期刊/卷”);
ap3.bind(vtdNav);
而((ap3.evalXPath())!=-1){
ArticleList.get(i).setVolume(vtdNav.toNormalizedString(vtdNav.getText());
}
ap3.resetXPath();
ap3.选择XPath(“/medline引文集/medline引文/文章/期刊/期刊/问题”);
ap3.bind(vtdNav);
而((ap3.evalXPath())!=-1){
articlesList.get(i).setIssue(vtdNav.toNormalizedString(vtdNav.getText());
}
ap3.resetXPath();
vtdNav.pop();
}...
感谢您的帮助!下面是一段代码片段,可帮助您提取文档中的相关字段。使用自动驾驶仪时存在问题
例如,<强>我建议你把所有的StReXPath都移出while循环,因为它们相对较慢。强。如果XML有深度嵌套,则应该考虑打开VTDGEN的选择深度,并将其设置为5 。这有助于提高导航/XPath性能。下面只是WH的示例。
VTDGen vtdGen = new VTDGen();
vtdGen.selectLcDepth(5);
vtdGen.parseFile("c:\\xml\\agata.xml",false);
AutoPilot ap = new AutoPilot(),ap1=new AutoPilot(),
ap2=new AutoPilot(),ap3=new AutoPilot();
VTDNav vn = vtdGen.getNav();
int i = -1;
ap.bind(vn);ap1.bind(vn);ap2.bind(vn);ap3.bind(vn);
ap.selectXPath("/MedlineCitationSet/MedlineCitation");
ap1.selectXPath("PMID");
ap2.selectXPath("DateCreated");
ap3.selectXPath("Article");
while ((ap.evalXPath()) != -1) {
String year = null, day = null, month = null;
i++;
if (vn.hasAttr("Owner")) System.out.println("Owner==>"+vn.toNormalizedString(vn.getAttrVal("Owner")));
//articlesList.get(i).setOwner(vtdNav.toNormalizedString(vtdNav.getAttrVal("Owner")));
if (vn.hasAttr("Status"))
System.out.println("Stats==>"+vn.toNormalizedString(vn.getAttrVal("Status")));
//articlesList.get(i).setStatus(vtdNav.toNormalizedString(vtdNav.getAttrVal("Status")));
vn.push();
while((ap1.evalXPath())!=-1){
System.out.println("Version==>"+vn.toNormalizedString(vn.getAttrVal("Version")));
System.out.println("PMID==>"+vn.toNormalizedString(vn.getText()));
}
ap1.resetXPath();
vn.pop();
vn.push();
while((ap2.evalXPath())!=-1){
vn.toElement(VTDNav.FIRST_CHILD,"Year");
System.out.println("Year==>"+vn.toNormalizedString(vn.getText()));
vn.toElement(VTDNav.PARENT);
vn.toElement(VTDNav.FIRST_CHILD,"Month");
System.out.println("Month==>"+vn.toNormalizedString(vn.getText()));
vn.toElement(VTDNav.PARENT);
vn.toElement(VTDNav.FIRST_CHILD,"Day");
System.out.println("Day==>"+vn.toNormalizedString(vn.getText()));
vn.toElement(VTDNav.PARENT);
}
ap2.resetXPath();
vn.pop();
VN.push();
while((ap3.evalXPath())!=-1){
System.out.println("PubModel==>"+vn.toNormalizedString(vn.getAttrVal("PubModel")));
VN.pop();
}