2017-03-08 5 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'))]でしたが、動作しません。

つの質問:私のXPATHと間違って何

  1. 信頼できるサイトはありますか?私はgoogleの最初の3ページを通過しましたが、私はそれらのいずれかで動作するようにXPATHを得ることができないので、私はそれらを評価するのに苦労します。

ありがとうございます。私は選択する必要がある場合、むしろ魚よりも釣り竿を得るだろう! :)

敬具、 パトリック

+2

それは、XPathでナンバーワンの象の罠だ - あなたが名前空間を無視してきました。 –

答えて

2

まず、試したXPathテスターサイトは、おそらく完璧に動作しています。 <environment-information xmlns="http://xml.juniper.net/junos/12.1X46/junos-chassis">

これが意味することは、その下の<environment-information>、すべてが異なる名前空間にあり、あなたのXPathはそれを反映していないということです。

あなたの表現が動作しない理由

は、このビットです。

これには2通りの方法があります。
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. ルック//ステータス/いない(テキスト()、 '不在') parent :: environment-informationで親要素を返す
  2. これを行うには、notepad ++のプラグインを試してください。
関連する問題