web-dev-qa-db-ja.com

XPath:値に基づいて要素を選択する方法は?

私はXPathを使用するのは初めてであり、これは基本的な質問かもしれません。どうかご容赦ください。問題の解決にご協力ください。次のようなXMLファイルがあります。

<RootNode>
  <FirstChild>
    <Element attribute1="abc" attribute2="xyz">Data</Element>
  <FirstChild>
</RootNode>

<Element>タグの存在を検証するには:

// Element [@ attribute1 = "abc"および@ attribute2 = "xyz"]

ここで、文字列"Data"のタグの値も確認します。これを達成するために私は使用するように言われました:

// Element [@ attribute1 = "abc" and @ attribute2 = "xyz" and Data]

後の式を使用すると、次のエラーが表示されます。

アサーション失敗メッセージ:一致するノードがありません//Element[@attribute1="abc" and @attribute2="xyz" and Data]

私が使用したXPath式が有効であるかどうか、アドバイスをください。そうでない場合、有効なXPath式は何になりますか?

208
vcosk

以下の条件:

//Element[@attribute1="abc" and @attribute2="xyz" and Data]

要素値データではなく、要素内の要素データの存在をチェックします。

代わりに使用できます

//Element[@attribute1="abc" and @attribute2="xyz" and text()="Data"]
308
Rashmi Pandit
//Element[@attribute1="abc" and @attribute2="xyz" and .="Data"]

この答えを追加する理由は、.text()の関係を説明したいからです。

最初のことは、[]を使用する場合、データには2つのタイプしかありません。

  1. ノードセットからノードを選択するには*[number]
  2. *[bool]は、ノードセットからノードセットをフィルタリングします

この場合、値は関数boolean()によってブール値に評価され、ルールがあります。

フィルターは常にコンテキストに関して評価されます。

text()または.を文字列"Data"と比較する必要がある場合、最初にstring()関数を使用してそれらを文字列型に変換し、ブール値の結果を取得します。

string()には2つの重要なルールがあります。

  1. string()関数は、ノードセットの最初のノードの文字列値を返すことにより、ノードセットを文字列に変換します。場合によっては、予期しない結果が生じる可能性があります。

    text()は、["Data"]のように、現在のノード(コンテキストノード)のすべてのテキストノードを含むノードセットを返す相対パスです。 string(["Data"])によって評価されると、ノードセットの最初のノードが返されるため、ノードセットにテキストノードが1つしかない場合にのみ「データ」を取得します。

  2. string()関数ですべての子テキストを連結する場合は、ノードセットではなく単一のノードを渡す必要があります。

    たとえば、ノードセット['a', 'b']を取得し、そこに親ノードをstring(parent)に渡すことができます。これは'ab'を返し、原因のstring(.)は連結文字列"Data"を返します。

どちらの方法でも、テキストノードがある場合にのみ同じ結果が得られます。

19
宏杰李