322

dom4j に含まれる XPath に小さな問題があります ...

私のXMLが

<Home>
    <Addr>
        <Street>ABC</Street>
        <Number>5</Number>
        <Comment>BLAH BLAH BLAH <br/><br/>ABC</Comment>
    </Addr>
</Home>

ルート要素を指定して、テキストに ABC が含まれるすべてのノードを見つけたいとしましょう...

したがって、私が書く必要のある XPath は次のようになります。

//*[contains(text(),'ABC')]

ただし、これは dom4j が返すものではありません .... これは dom4j の問題ですか、それとも XPath がどのように機能するかを理解していますStreetComment?

DOM はComment要素を 4 つのタグ 2 を持つ複合要素にします

[Text = 'XYZ'][BR][BR][Text = 'ABC'] 

要素を見つけて実行する必要があるため、クエリは引き続き要素を返す必要があると思いますが、そうではありません...

次のクエリは要素を返しますが、要素だけでなく、親要素も返します。これは問題にとって望ましくありません。

//*[contains(text(),'ABC')]

<Street/>要素とだけを返す XPath クエリを知っている人はいます<Comment/>か?

4

9 に答える 9

861

この<Comment>タグには、2 つのテキスト ノードと 2 つの<br>ノードが子として含まれています。

あなたのxpath式は

//*[contains(text(),'ABC')]

これを分解するには、

  1. *任意の要素 (タグなど) に一致するセレクターです。ノードセットを返します。
  2. []、そのノード セット内の個々のノードで動作する条件です。動作する個々のノードのいずれかが括弧内の条件に一致する場合に一致します。
  3. text()コンテキスト ノードの子であるすべてのテキスト ノードに一致するセレクタです。ノード セットを返します。
  4. contains文字列を操作する関数です。ノード セットが渡された場合、ノード セットは、ドキュメント順で最初のノード セット内のノードの文字列値を返すことによって、文字列に変換されます。したがって、<Comment>要素の最初のテキスト ノード、つまりBLAH BLAH BLAH. それは一致しないため、<Comment>結果に a は表示されません。

これをに変更する必要があります

//*[text()[contains(.,'ABC')]]
  1. *任意の要素 (タグなど) に一致するセレクターです。ノードセットを返します。
  2. 外側[]は、そのノード セット内の個々のノードで動作する条件です。ここでは、ドキュメント内の各要素で動作します。
  3. text()コンテキスト ノードの子であるすべてのテキスト ノードに一致するセレクタです。ノード セットを返します。
  4. 内側[]は、そのノード セット内の各ノード (ここでは個々のテキスト ノード) で動作する条件です。個々のテキスト ノードは、括弧内のパスの開始点であり、括弧内で明示的に参照することもでき.ます。動作する個々のノードのいずれかが括弧内の条件に一致する場合に一致します。
  5. contains文字列を操作する関数です。ここでは、個々のテキスト ノード ( .) が渡されます。<Comment>タグ内の 2 番目のテキスト ノードが個別に渡されるため、'ABC'文字列が表示され、一致することができます。
于 2010-09-07T03:36:37.607 に答える