У меня есть следующий XML-файл:
<project>
<category type="Files">
<type name="File" type="String" id="1">
<field name="Name" type="String">
<value type="String"><![CDATA[Smile.JPG]]></value>
</field>
<multiValue name="Entries" type="FileEntry">
<model type="Specs" state="Intact">
<field name="Value" type="String">
<value type="String"><![CDATA[10241624]]></value>
</field>
</model>
</multiValue>
</type>
<type name="File" type="String" id="2">
<field name="Name" type="String">
<value type="String"><![CDATA[OldMan.JPG]]></value>
</field>
<multiValue name="Entries" type="FileEntry">
<model type="Specs" state="Gone">
<field name="Category" type="String">
<value type="String"><![CDATA[Size]]></value>
</field>
<field name="Value" type="String">
<value type="String"><![CDATA[821563412]]></value>
</field>
</model>
</multiValue>
</type>
</category>
</project>
фрагмент кода Java: (просто код, чтобы изолировать проблему)
VTDGen vg = new VTDGen();
int i;
AutoPilot ap = new AutoPilot();
ap.selectXPath("/project/category[@type=\"Files\"]");
AutoPilot ap2 = new AutoPilot();
BookMark bm = new BookMark();
vg.parseFile("stackoverflow_example.xml", false);
VTDNav vn = vg.getNav();
ap.bind(vn);
ap2.bind(vn);
/* main XPath selection */
ap.selectXPath("/project/category[@type=\"Files\"]");
/* part 1 */
//XPath eval returns one node at a time
ap2.selectXPath("type[@name=\"File\"]/field/value/text()");
while ((i = ap.evalXPath()) != -1) {
bm.recordCursorPosition(); // equivalent to vn.push();
int j;
while ((j = ap2.evalXPath()) != -1) {
logger.debug(" NAME ==> " + vn.toString(j));
}
ap2.resetXPath();
bm.setCursorPosition(); // equivalent to vn.pop();
}
ap.resetXPath();
/* part 2 */
ap2.selectXPath("type[@name=\"File\"]/multiValue/model[@type=\"Specs\"]/field[@name=\"Value\"]/value/text()");
while ((i = ap.evalXPath()) != -1) {
bm.recordCursorPosition(); // equivalent to vn.push();
int j;
while ((j = ap2.evalXPath()) != -1) {
logger.debug(" SIZE ==> " + vn.toString(j));
}
ap2.resetXPath();
bm.setCursorPosition(); // equivalent to vn.pop();
}
ap.resetXPath();
И после нахождения одного раздела типа сИмя файла, я хочу получить имя файла и размер из этого раздела.(Конечно, чуть позже, но, на мой взгляд, этого было бы достаточно).
Проблема с кодом заключается в том, что он находит совпадающие значения, но SIZE не является дочерним.из файла.
Вывод:
NAME ==> Smile.JPG
NAME ==> OldMan.JPG
SIZE ==> 10241624
SIZE ==> 821563412
У меня есть два автопилота, один для основного раздела, и у меня была идея выполнить внутренний поиск со вторым автопилотом.
Кто-нибудь может помочь только «поиск» в первом найденном разделе?Я хотел бы иметь вывод, например:
NAME ==> Smile.JPG
SIZE ==> 10241624
NAME ==> OldMan.JPG
SIZE ==> 821563412