在XPATH中转义括号(document.evaluate)

时间:2017-10-17 20:25:09

标签: javascript xpath document.evaluate

我使用以下代码迭代包含电话号码的所有DOM元素。当搜索的电话号码字符串中没有任何括号时,此代码有效,但我认为括号正在弄乱XPATH contains()函数。有没有人知道如何逃避这些括号以使代码再次起作用?

var oldPhoneNumber = '(123) 456-7890';
if (document.evaluate) {
    var nextElement = document.evaluate("//text()[contains(.,\"" + oldPhoneNumber + "\")]", document, null, XPathResult.ANY_TYPE, null).iterateNext();
    while (nextElement) {
        nextElement = document.evaluate("//text()[contains(.,\"" + oldPhoneNumber + "\")]", document, null, XPathResult.ANY_TYPE, null).iterateNext();
    }
}

谢谢!

1 个答案:

答案 0 :(得分:0)

我不明白为什么括号应该导致失败。有什么症状?

请注意,通过字符串连接构造XPath表达式是不好的形式。有两个主要原因:您受到注射攻击,并且每次使用时都必须重新编译表达式。包含变量的表达式要好得多,编译表达式一次,并在每次执行表达式时为变量提供值。

但是你使用的是Javascript,所以你可能没有太多选择(当然,除非你转到Saxon-JS)。

(稍后)再次思考可能导致这种情况的原因,我想到了几种可能性。也许电话号码中的空格实际上是不间断的空间?也许DOM没有规范化,电话号码分为多个文本节点? (最好避免使用text()。请尝试使用//*[contains(., '....')]。)