2016-04-15 37 views
1

私は、ジョブのXMLドキュメントを会社名でフィルタリングしようとしています。XPathを使用した複数の値によるフィルタリング

私が使用して特定の会社名に一致するすべての項目を引くことができています:

doc.xpath("/source/job[company[text() = 'BigCorp' or text() = 'MegaCorp']]") 

私は反対をし、のようなものを使用して、これらの値により除外することができません:

doc.xpath("/source/job[company[text() != 'Hodes' or text() != 'Scurri']]") 

間違ってる?カンマ区切りの値リストを提供する方法はありますか?

+0

要約:https://en.m.wikipedia.org/wiki/De_Morgan%27s_laws – Phrogz

+0

ようこそスタックオーバーフロー。質問するときは、問題を実証するのに必要な最小限の入力データと、期待される出力が必要です。 "[ask]"と "[mcve]"をお読みください。 –

答えて

3

andorを変更してみてください:

doc.xpath("/source/job[company[text() != 'Hodes' and text() != 'Scurri']]") 

あなたがorを使用している場合、常に仕事を返すために起こっています。

例えば、text() != 'Scurri'が真であり(逆もまた同様)、企業Hodesの仕事を返します。


次のコメントについて:

のでnormalize-space()はそれをやりました! doc.xpath("/source/job[company[normalize-space() != 'Hodes' and normalize-space() != 'Scurri']]")なぜわからないのですか?

normalize-space()の理由は、text()も空白を返すためです。例えば

あなたのような要素を持っている場合、:

<company> 
Hodes 
</company> 

か:

<company> Hodes </company> 

text() "_Hodes_を" 等しくなります。空白のため、 "_Hodes_"は "Hodes"に等しくありません。空白のため、空白のため "_Hodes_"は "Hodes"に等しくありません。

normalize-space()を使用すると、先頭と末尾の空白を削除し、複数の空白を1つの空白で置き換えます。

+0

ありがとう - 私はそれを試みましたが、それでもそれらの企業を返します 'doc = doc.xpath("/source/job [company [text()!= 'Hodes'とtext()!= 'Scurri']]) ')' – cman77

+0

@ cman77 - ご質問に最小限の例を追加できますか?たぶん 'text()'を 'normalize-space()'に置き換えてみてください。 –

+0

だから 'normalize-space()'しました! 'doc.xpath("/source/job [normalize-space()!= 'Hodes'とnormalize-space()!= 'Scurri']] ')'なぜ分かりませんか? – cman77

関連する問題