Использование xpath и vtd-xml для получения подузлов и текста элемента в виде строки - PullRequest
6 голосов
/ 14 мая 2011

Это часть моего 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 я использовал автопилот с XPath "// L / D" и "// L / D / text ()", но это не сработало.

Любой совет или альтернативный подход будут оценены.

Привет

Ответы [ 2 ]

13 голосов
/ 16 мая 2011

Ниже приведен код, который делает то, что вы ищете.

    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)));
        }
    }
3 голосов
/ 15 мая 2011

Использование :

/*/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>
...