2

我正在编写一个相当基本的 GreaseMonkey 脚本,该脚本在特定元素中定位文本,然后使用该文本稍后执行操作。相关代码位如下:

在 HTML 中有一个带有“someclass”类的 span,其中包含一小段文本:

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

然后在 JavaScript 中,我试图找到这个类并使用标准的 XPath jazz 将它的内容(“一些文本”)拉到一个变量中:

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 程序)转换为不包含这两种字符的字符串。

最简单的方法是用它的字符实体替换这些类型字符之一的每个实例 - 比如说替换每个'&#39;使用'作为文字字符串的周围字符。

第二种方法是更换

some text&#39;s text

使用 XPath 表达式:

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

警告:使用不受信任的数据来创建 XPath 表达式不是一个好主意——这可能会导致XPath 注入。为避免 XPath 注入,如果您的编程语言和函数库允许这样做,请始终编译您的XPath 表达式并在将数据作为参数传递的情况下运行它。

于 2010-08-14T13:46:03.830 回答