2017-03-08 27 views
1

我有這樣的XML揭祕XPATH

<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> 

我要顯示所有「環保項目」不具有狀態=「缺席」。

我已經嘗試了很多網站來測試XPATH,但都沒有拿出答案。我認爲這將是/rpc-reply/environment-information/*[not(contains(status, 'Absent'))]/rpc-reply/environment-information[1]/*[not(contains(status, 'Absent'))],但它不起作用。

兩個問題:

  1. 這有什麼錯我的XPATH?
  2. 有沒有可靠的網站來測試它?我已經瀏覽了谷歌的前三頁,但是由於我無法獲得XPATH來處理其中的任何一個,所以我很難評估它們。

感謝任何解釋。如果我不得不選擇,寧願拿一根釣魚竿而不是一條魚! :)

親切的問候, 帕特里克

+2

這是頭號大象陷阱使用XPath - 已忽略的命名空間。 –

回答

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'))]

+0

我也應該評論。這救了我很多頭疼,並已經得到了回報。非常感謝您的解釋! – PatrikJ

0

我覺得這可能是工作:

//*[name()="environment-item" and not(contains(./*[name()="status"], "Absent"))] 
1
  1. 查找狀態元素直接//狀態/不(文字(), '缺席')並返回父元素父::環境信息
  2. 嘗試插入記事本++來做到這一點。