XPATH使用条件过滤不同内部路径中的元素

时间:2017-03-06 10:08:00

标签: java xpath

团队,我正在阅读多个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

2 个答案:

答案 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的所有子元素