Использование xpath и vtd-xml для получения подузлов и текста элемента в виде строки
Это часть моего XML:
<MAIN>
<L>
<D>string1 string2 <b>string3</b> string4</D>
</L>
<L>
<D>string5 string6 <b>string7</b> string8 <i>string9</i></D>
</L>
</MAIN>
I want to get the content of all the <D> tags as string. So, the example above should return:
1st iteration: 'string1 string2 <b>string3</b> string4'
2nd iteration: 'string5 string6 <b>string7</b> string8 <i>string9</i>'
etc...
В vtd-xml я использовал AutoPilot с XPath "//L/D" и "//L/D/text()", но это не сработало.
Любой совет или альтернативный подход будут оценены.
С уважением
2 ответа
Решение
Ниже приведен код, который делает то, что вы ищете.
VTDGen vg = new VTDGen();
if (vg.parseFile("c://xml//alex.txt", true)){
VTDNav vn = vg.getNav();
AutoPilot ap = new AutoPilot(vn);
ap.selectXPath("//L/D");
int i=-1;
while((i=ap.evalXPath())!=-1){
long l = vn.getContentFragment();
System.out.println(" -==> "+ vn.toString((int )l, (int)(l>>32)));
}
}
Используйте:
/*/L/D/node()
Это выбирает все узлы (элементы, текстовые узлы, инструкции обработки и комментарии-узлы), которые являются дочерними элементами любого D
элемент, который является ребенком любого L
элемент, который является дочерним по отношению к верхнему элементу документа XML.
Кроме того, вы можете выбрать отдельно все дочерние узлы двух /*/L/D
элементы:
/*/L[1]/D/node()
а также
/*/L[2]/D/node()
Проверка с использованием XSLT в качестве хоста XPath:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select="/*/L[1]/D/node()"/>
--------------------
<xsl:copy-of select="/*/L[2]/D/node()"/>
</xsl:template>
</xsl:stylesheet>
при применении к предоставленному документу XML:
<MAIN>
<L>
<D>string1 string2
<b>string3</b> string4
</D>
</L>
<L>
<D>string5 string6
<b>string7</b> string8
<i>string9</i>
</D>
</L>
</MAIN>
желаемый, правильный результат получается:
string1 string2
<b>string3</b> string4
--------------------
string5 string6
<b>string7</b> string8
<i>string9</i>