我有这个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'))]
,但它不起作用。
两个问题:
感谢任何解释。如果我必须选择的话,宁可拿鱼竿而不是鱼! :)
亲切的问候, 帕特里克
答案 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)
答案 2 :(得分:0)
我认为这可行:
//*[name()="environment-item" and not(contains(./*[name()="status"], "Absent"))]