Javascript Firefox/GreaseMonkey中的XPath阻塞实体

Javascript Firefox/GreaseMonkey中的XPath阻塞实体,javascript,firefox,xpath,greasemonkey,entities,Javascript,Firefox,Xpath,Greasemonkey,Entities,我正在编写一个相当基本的GreaseMonkey脚本,该脚本将文本定位到特定元素中,然后使用该文本稍后进行操作。相关代码位如下所示: 在HTML中,有一个包含“someclass”类的span,该类包含一个小文本字符串: <span class="someclass">some text</span> 问题是:当我在“some text”是包含基本字符的基本字符串的页面上运行时,一切正常,但当我在“some text”包含实体的页面上运行时,它失败了。例如,这些都很好,

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

在HTML中,有一个包含“someclass”类的span,该类包含一个小文本字符串:

<span class="someclass">some text</span>
问题是:当我在“some text”是包含基本字符的基本字符串的页面上运行时,一切正常,但当我在“some text”包含实体的页面上运行时,它失败了。例如,这些都很好,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>
我在这里和Google上发现了一些关于XPath如何处理实体的结果,但它们都在做类似于
[text()=“blah&racquo;blah']
——换句话说,它们的实体在XPath查询本身中。我的不是,而是在我试图从XPath查询返回的文本中

这是同一个问题吗?有什么简单的办法吗


谢谢

问题在于XPath表达式中的字符串文字必须由引号或撇号包围,并且不应包含周围的字符

同时包含引号和撇号的文本字符串需要转换为不同时包含这两种字符的字符串(在您的情况下由Javascript程序)

最简单的方法是用字符实体替换其中一种字符类型的每个实例,比如用
&39替换每个
并使用
作为文本字符串的周围字符

第二种方法是替换

some text&#39;s text
使用XPath表达式:

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

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

Hmm,我刚刚在Greasemonkey脚本中尝试了上面的JS行,您的示例在测试页面中使用了字符实体,并且脚本工作正常。我想知道它是否与文档类型或其他有关;如果您的测试页面只是“一些文本”,会发生什么;(那是我用过的测试页)?啊,你说得对。它确实会从中返回文本-但是,它不是我期望的文本。它不会返回实体完整的文本,而是将其转换为实际的撇号,这会导致脚本中的另一个XPath查询中断。所以我想我的第一个问题的答案是,这是同一个问题。。。我的第二个问题的答案是,我必须编写与这里给出的函数之一相当的JS:谢谢你的回复,它很有帮助!我一直在尝试“简单的方法”,但似乎Firefox的XPath实现(或者可能所有的XPath实现,我不知道,我只是假装是一个程序员…)会自动计算字符实体,所以查询“';”实际上不起作用,即使这是HTML中的内容。你的第二条路是我该怎么做。干杯@ccw:如果您发出替换(“'”、“';”),则“简单方法”将起作用。在文本中,它实际上只是一个撇号——在阅读文本时,浏览器会将任何字符实体转换为单个字符。您必须以编程方式执行相反的操作。
Error: The expression is not a legal expression.
Source File: file:///blahblahblah.user.js
Line: (JS line i gave above)
some text&#39;s text
concat('some text', "'", ' text')