团队,我正在阅读多个XPATH教程,但无法使用一个XPathExpression实现以下预期。
如何获得PostpaidInformation - > AccountNumber的ActiveValue和Date值= AC-12 ..?
<params>
<param>
<value>
<struct>
<member>
<name>PrepaidInformation</name>
<value>
<struct>
<member>
<name>activationStatus</name>
<value>
<boolean>1</boolean>
</value>
</member>
</struct>
</value>
</member>
<member>
<name>MixedInformation</name>
<value>
<struct>
<member>
<name>activationStatus</name>
<value>
<boolean>0</boolean>
</value>
</member>
</struct>
</value>
</member>
<member>
<name>PostpaidInformation</name>
<value>
<array>
<data>
<value>
<struct>
<member>
<name>ActiveValue</name>
<value>
<string>60</string>
</value>
</member>
<member>
<name>Date</name>
<value>
<string>20170225T12:00:00</string>
</value>
</member>
<member>
<name>AccountNumber</name>
<value>
<i4>AC-12</i4>
</value>
</member>
</struct>
</value>
<value>
<struct>
<member>
<name>ActiveValue</name>
<value>
<string>23</string>
</value>
</member>
<member>
<name>Date</name>
<value>
<string>20170225T12:00:00</string>
</value>
</member>
<member>
<name>AccountNumber</name>
<value>
<i4>AC-13</i4>
</value>
</member>
</struct>
</value>
</data>
</array>
</value>
</member>
</struct>
</value>
</param>
</params>
注意我必须匹配PostpaidInformation,然后匹配AccountNumber = AC-12。如果匹配则打印有关该帐户的所有信息。
也许我需要的是//methodResponse/params/param/value/struct/member/name[text()=\"PostpaidInformation\"]
TRAVERSE其中的所有帐户,直到找到AccountNumber=AC-12
,如果找到,则从member/value
返回到<struct>
的一个级别以迭代所有该结构中的<member>
。
预期输出是下面的NodeSet遍历。
<member>
<name>ActiveValue</name>
<value>
<string>60</string>
</value>
</member>
<member>
<name>Date</name>
<value>
<string>20170225T12:00:00</string>
</value>
</member>
<member>
<name>AccountNumber</name>
<value>
<i4>AC-12</i4>
</value>
</member>
来自
的实际答案安德森
//member/name[text()="PostpaidInformation"]/following-sibling::
value/array/data/value/struct[member[name="AccountNumber"]/value/i4="AC-12"]
har07是
//member[name='PostpaidInformation']//struct[member[name='AccountNumber' and value/i4='AC-12']]/member
答案 0 :(得分:1)
你可以尝试一下:
//member/name[text()="PostpaidInformation"][1]/following-sibling::value/array/data/value/struct/member
此XPath
应返回3个member
个节点:
<member>
<name>ActiveValue</name>
<value>
<string>60</string>
</value>
</member>
<member>
<name>Date</name>
<value>
<string>20170225T12:00:00</string>
</value>
</member>
<member>
<name>AccountNumber</name>
<value>
<i4>AC-12</i4>
</value>
</member>
如果您想要检索包含3 <struct>
:
<member>
//member/name[text()="PostpaidInformation"]/following-sibling::value/array/data/value/struct[member[name[.="AccountNumber"]/following-sibling::value/i4="AC-12"]]
答案 1 :(得分:1)
这是一个可能的XPath(为了可读性而包装):
//member[name='PostpaidInformation']
//struct[member[name='AccountNumber' and value/i4='AC-12']]
/member
<强> demo
强>
简要说明:
//member[name='PostpaidInformation']
:搜索member
元素name
子值等于&#39; PostpaidInformation&#39;
//struct[member[name='AccountNumber' and value/i4='AC-12']]
:在此member
元素中,搜索包含子元素struct
的后代member
元素,其中{{1} } equals&#39; AccountNumber&#39;和name
等于&#39; AC-12&#39;
value/i4
:从此类/member
返回名为struct
的所有子元素