揭开XPATH的神秘面纱

时间:2017-03-08 21:06:06

标签: xml xpath

我有这个XML

<rpc-reply xmlns:junos="http://xml.juniper.net/junos/12.1X46/junos">
    <environment-information xmlns="http://xml.juniper.net/junos/12.1X46/junos-chassis">
        <environment-item>
            <name>Routing Engine</name>
            <class>Temp</class>
            <status>Failed</status>
            <temperature junos:celsius="50">50 degrees C / 122 degrees F</temperature>
        </environment-item>
        <environment-item>
            <name>Routing Engine CPU</name>
            <status>Absent</status>
        </environment-item>
        <environment-item>
            <name>Power Supply 0</name>
            <class>Power</class>
            <status>OK</status>
        </environment-item>
        <environment-item>
            <name>Power Supply 1</name>
            <class>Power</class>
            <status>Absent</status>
        </environment-item>
    </environment-information>
    <cli>
        <banner></banner>
    </cli>
</rpc-reply>

我想显示所有没有status =“Absent”的“环境项目”。

我已尝试过很多网站来测试XPATH,但未能找到答案。我认为它的方式是/rpc-reply/environment-information/*[not(contains(status, 'Absent'))]/rpc-reply/environment-information[1]/*[not(contains(status, 'Absent'))],但它不起作用。

两个问题:

  1. 我的XPATH出了什么问题?
  2. 是否有可靠的网站进行测试?我已经浏览了谷歌的前三页,但由于我无法让XPATH在任何一个上面工作,我很难对它们进行评估。
  3. 感谢任何解释。如果我必须选择的话,宁可拿鱼竿而不是鱼! :)

    亲切的问候, 帕特里克

3 个答案:

答案 0 :(得分:2)

首先,您尝试过的XPath测试站点可能工作正常。

表达式不起作用的原因是:<environment-information xmlns="http://xml.juniper.net/junos/12.1X46/junos-chassis">

这意味着<environment-information>及其下的所有内容都位于不同的命名空间中,而您的xpath并未反映出来。

有两种解决方法:
1.您可以在运行xpath表达式的任何引擎中声明命名空间绑定。没有标准方法可以执行此操作,解决方案将根据引擎的实现而有所不同。 请注意,由于<rpc-reply>位于默认命名空间中,因此您必须将http://xml.juniper.net/junos/12.1X46/junos-chassis绑定到其他前缀并执行以下操作:/rpc-reply/MY_PREFIX:environment-information/*[not(contains(MY_PREFIX:status, 'Absent'))]
2.如果您的引擎支持XPath 2.0或更高版本,则可以使用如下命名空间通配符:/rpc-reply/*:environment-information/*[not(contains(*:status, 'Absent'))]

答案 1 :(得分:1)

  1. 直接查找status元素// status / not(text(),&#39; absent&#39;)并返回父元素with parent :: environment-information
  2. 尝试使用notepad ++的插件来执行此操作。

答案 2 :(得分:0)

我认为这可行:

//*[name()="environment-item" and not(contains(./*[name()="status"], "Absent"))]