2

私は、特定の要素内のテキストを検索し、そのテキストを使用して後で処理する、かなり基本的なGreaseMonkeyスクリプトを作成しています。関連するコードは次のとおりです。

HTMLには、クラス'someclass'のスパンがあり、これには小さなテキスト文字列が含まれています。

<span class="someclass">some text</span>

次に、JavaScriptで、このクラスを見つけて、そのコンテンツ(「テ​​キスト」)を標準のXPathジャズを使用して変数にプルしようとしています。

document.evaluate("//span[@class='someclass']/text()", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);

問題は次のとおりです。「一部のテキスト」が基本文字を含む基本文字列であるページでこれを実行すると、すべてが正常に機能しますが、「一部のテキスト」にエンティティが含まれているページで実行すると失敗します。たとえば、これらはすべて問題なく、XPathは必要なテキストを返します。

<span class="someclass">some text</span>
<span class="someclass">some other text</span>
<span class="someclass">sometext</span>
<span class="someclass">some text 12345</span>

ただし、これによりエラーが発生します。

<span class="someclass">some text&#39;s text</span>

返されるエラーは次のとおりです。

Error: The expression is not a legal expression.
Source File: file:///blahblahblah.user.js
Line: (JS line i gave above)

こことGoogleで、XPathがエンティティとどのように問題を抱えているかについて話している結果をいくつか見つけましたが、それらはすべて次のようなことをしてい[text() = 'blah &racquo; blah']ました。つまり、エンティティはXPathクエリ自体にあります。私はそうではありません、それらは私がXPathクエリから返そうとしているテキストにあります。

これは同じ問題ですか?それを回避する簡単な方法はありますか?

ありがとう!

4

1 に答える 1

1

問題は、XPath式の文字列リテラルを引用符またはアポストロフィで囲む必要があり、周囲の文字を含めることはできないということです。

引用符とアポストロフィの両方を含むリテラル文字列は、(この場合はJavascriptプログラムによって)これらのタイプの文字の両方を含まない文字列に変換する必要があります。

これを行う最も簡単な方法は、これらのタイプの文字の1つの各インスタンスをその文字エンティティに置き換えることです。たとえば、すべて'をに置き換えて、リテラル文字列の周囲の文字として&#39;使用します。'

2番目の方法は交換することです

some text&#39;s text

XPath式を使用する場合:

concat('some text', "'", ' text')

警告:信頼できないデータを使用してXPath式を作成することはお勧めできません。これにより、XPathインジェクションが発生する可能性があります。XPathインジェクションを回避するために、プログラミング言語と関数ライブラリでこれが許可されている場合は、常にXPath式をコンパイル、データをパラメーターとして渡して実行します。

于 2010-08-14T13:46:03.830 に答える