获取XML节点匹配XPath表达式

时间:2012-08-24 13:36:36

标签: xpath xml-parsing

我希望你能帮忙解决这个问题。我在线尝试了许多XPath测试人员,但无法找到解决方案。

我正在尝试使用此XML中的'~tid'属性获取第一个节点的值:

<Response status="ok" version="1.1">
                 <Action>
                    <Page>
                       <Params>
                          <Param name="~tid" value="1345811517165"/>
                          <Param name="~action-type" value="DATA"/>
                          <Param name="~from-page" value="login"/>
                          <Param name="~from-act" value="submitData"/>
                          <Param name="login_USERNAME" value="" type="0"/>
                          <Param name="login_PASSWORD" value="" type="0"/>
                       </Params>
                    </Page>
                    <Data name="clientData" method="POST">
                       <Params>
                          <Param name="timezoneoffset" value=""/>
                          <Param name="daylightsavings" value=""/>
                       </Params>
                    </Data>
                 </Action>
                 <Action>
                    <Page>
                       <Params>
                          <Param name="~tid" value="1345811517165"/>
                          <Param name="~action-type" value="NAV"/>
                          <Param name="~from-page" value="login"/>
                          <Param name="~from-act" value="resetPassword"/>
                          <Param name="~to-page" value="login_resetPassword"/>
                       </Params>
                    </Page>
                 </Action>
                 <Action>
                    <Page>
                       <Params>
                          <Param name="~tid" value="1345811517165"/>
                          <Param name="~action-type" value="NAV"/>
                          <Param name="~from-page" value="login"/>
                          <Param name="~from-act" value="newUser"/>
                          <Param name="~to-page" value="login_newUser"/>
                       </Params>
                    </Page>
                 </Action>
</Response>

我正在使用的XPath是:

//Params[1]/Param[@name='~tid']/@value

它获得所有三个值。我怎样才能得到第一个?

2 个答案:

答案 0 :(得分:1)

尝试

/descendant::Params[1]/Param[@name='~tid']/@value

来自W3C XPath specification

  

注意:位置路径//para[1]与位置路径/descendant::para[1]的含义不同。后者选择第一个后代para元素;前者选择所有后代para元素,这些元素是父母的第一个para子元素。

答案 1 :(得分:0)

这是XPath中第二大常见问题解答

使用

(//Params/Param[@name='~tid'])[1]/@value 

甚至

(//Param[@name='~tid'])[1]/@value 

<强>解释

XPath伪运算符//的优先级(优先级)低于[]运算符。

当需要覆盖默认优先级时,任何语言中的常用解决方案是使用明确指定新的所需优先级的括号。