0

ドキュメントのクエリorg.jdom2.xpathを評価するために使用しています。要素からスクリプト テキストを取得しようとして、次のクエリを試しました。XPathhtmlhead

/html/head/script[contains(text(), 'expression1') and contains(text(), 'expression2')]/text()

このクエリは、XPath ヘルパーChrome コンソール ($xクエリ)の両方で 1 つの結果を返しますが、org.jdom2.xpath.

より単純な (しかしより重い) クエリを試す:

//script[contains(text(), 'expression1') and contains(text(), 'expression2')]/text()

同じ結果が得られます。

コードサンプル:

String xpath = "/html/head/script[contains(text(), 'expression1') and contains(text(), 'expression2')]/text()";
List<Text> tokeScriptResults = (List<Text>) xpathFactory.compile(xpath).evaluate(document);

後付け:Documentオブジェクトを見ると、スクリプト テキストが非常に長いため、1 つの long ではなく s のjdom2配列に分割されていることがわかります。これが問題でしょうか?TextText

4

1 に答える 1

2

簡単な答え -.の代わりにtext()使用します。contains(., 'expression1')

より長い答え -コンテキスト ノードの直接の子であるすべてのテキスト ノードのセットtext()を選択するパス ステップです。この関数は、その引数がノード セットではなく文字列であることを想定しており、XPath 1.0 でノード セットを文字列に変換する規則は、セット内の最初のノードの文字列値をドキュメントの順序で取得し、他のノードを完全に無視することです。したがって、テストは最初のテキスト ノードの子のみを調べます。containscontains(text(), 'expression1')

そうする代わりにcontains(., 'expression1')、最初の引数は単一のノード (スクリプト要素) を含むセットであり、要素ノードの文字列値は、そのすべての子孫テキスト ノードをドキュメント順に連結したものになります。したがって、これは、最初のテキスト ノードの子だけでなく、script タグの下のすべてのテキストを調べます。

一般に、XPathで使用する必要はほとんどありません。text()個別のテキスト ノードを個別に処理する必要がある場合にのみ必要です。述語では、要素ノードの文字列値をテストすると、ほとんどの場合、意図をより適切に捉えることができます。

于 2014-08-08T08:16:05.697 に答える