11

XPathを使用して、xmlファイル内のノードをその値で見つける必要があります。検索するノードに空白を含む値が含まれている場合、問題が発生します。Fe:

<Root>
  <Child>value</Child>
  <Child>value with spaces</Child>
</Root>

2番目の子ノードを見つけるXPathを構築できません。

単純なXPath/Root / Childは両方の子に対して完全に機能しますが、/ Root [Child = valuewithspaces]は空のコレクションを返します。

私はすでに%20&#20でスペースをマスキングしようとしました。、&​​nbsp; 引用符と二重引用符を使用します。

まだ運がない。

誰かアイデアがありますか?

4

7 に答える 7

20

正確な状況に応じて、ノードを選択するさまざまなXPath式があり、その値には空白が含まれています。

まず、これらの文字のいずれかが「空白」であることを思い出してください。

    &#x09; -タブ

    &#xA; --改行

    &#xD; - キャリッジリターン

    ' 'または&#x20; -スペース

ノードの正確な値がわかっている場合はHello World、スペースを含む ""とすると、最も直接的なXPath式になります。

     /top/aChild[. = 'Hello World']

このノードを選択します。

ただし、空白を含む値を指定する際の問題は、すべての空白文字が空白と同じように表示され、それがスペースのグループなのか単一のタブなのかわからないためです。

XPath 2.0では正規表現を使用でき、シンプルで便利なソリューションを提供します。したがって、XPath2.0式を次のように使用できます。

    /*/aChild[matches(., "Hello\sWorld")]

最上位ノードの子を選択します。その値は、文字列「Hello」、空白、文字列「World」の順になります。関数と空白に一致する""パターンの使用に注意してください。matches()\s

XPath 1.0では、特定の文字列に空白文字が含まれているかどうかをテストするのに便利です。

not(string-length(.)= stringlength(translate(., ' &#9;&#xA;&#xD;','')))

ここでは、translate()関数を使用して4つの空白文字のいずれかを削除し、結果の文字列の長さを元の文字列の長さと比較します。

したがって、テキストエディタでノードの値が次のように表示される場合

"こんにちは世界"、

XPath式を使用してこのノードを安全に選択できます。

/*/aChild[translate(., ' &#9;&#xA;&#xD;','') = 'HelloWorld']

多くの場合、XPath関数を使用することもできます。この関数normalize-space()は、文字列引数から、先頭と末尾の空白のグループが切り取られ、文字列内のすべての空白が単一のスペースに置き換えられる別の文字列を生成します。

上記の場合、単純に次のXPath式を使用します。

/*/aChild[normalize-space() = 'Hello World']

于 2008-12-26T17:33:37.817 に答える
10

次のいずれかを試してください。

/Root/Child[normalize-space(text())=value without spaces]

また

/Root/Child[contains(text(),value without spaces)]

または(テスト値が問題のように見えるため)

/Root/Child[normalize-space(text())=normalize-space(value with spaces)]

実際にはこれらのいずれも実行していないため、構文が不安定になる可能性があります。

于 2008-12-26T15:11:24.003 に答える
0

x0020は、プロパティ名にスペースが含まれているジャックラビット ベースの CQ5/AEM リポジトリで機能しました。以下は、プロパティ「レコードID」で機能します-

[(jcr:contains(jcr:content/@Record_x0020_ID, 'test'))]
于 2016-02-05T10:58:50.190 に答える
0

#x20 を試しましたか?

于 2008-12-26T15:10:27.607 に答える
0

2番目のリンクのようにこれをグーグルで検索しました:

「 x0020」を使用してスペースを置き換えてみてください

これは男のために働くようです。

于 2008-12-26T16:14:46.010 に答える