使用xpath查找带撇号的文本(“'”)

时间:2017-03-16 12:36:46

标签: java xpath

我已经研究过但似乎没什么用。假设我想要一个带有“Tony's Computer”文本的xpath。我无法做到以下几点:

//*[contains(text(), 'Tony's Computer')]

由于显而易见的原因,因为'在y和s之间取消引用文本。但这也不奏效:

//*[contains(text(), 'Tony\'s Computer')]

//*[contains(text(), 'Tony''s Computer')]

有没有办法逃避撇号?我找不到任何东西。我能做的最好的是以下Java(假设 textToLookFor 有要查找的文本):

        String[] fields = textToLookFor.split("'");
        String textx = "";
        for (int indx = 0; indx < fields.length; indx++) {
            String stext = fields[indx];
            String cont = "contains(text(),'" + stext + "') ";
            if (!textx.isEmpty()) {
                textx += " and ";
            }
            textx += cont;
        }
        String xpath = "//*[" + textx + "]";

基本上做了

//*[contains(text(),'Tony') and contains(text(), 's Computer')]

这是我认为足够好的。但是,它并不完全匹配。例如,它可以找到“托尼和鲍勃的计算机”。

有没有其他人成功做到这一点?我找不到任何其他解决方案。 顺便说一句,当我找到元素时,我可以说String displayed = ele.getText();然后检查shown.contains(textToLookFor)。

在这种情况下,我首先需要做一个 textToLookFor = textToLookFor.replaceAll(“\”“,”\\\“”); ,它会转义任何双引号。

3 个答案:

答案 0 :(得分:1)

我假设您使用的是XPath 1.0。您是否尝试在XPath中使用实体&apos;

//*[contains(text(), 'Tony&apos;s Computer')]

加倍单撇号应该适用于XSLT 2.0。所以,另一个选择是使用Saxon as your XPath engine,然后使用XPath 2.0,然后以下工作:

//*[contains(text(), 'Tony''s Computer')]

答案 1 :(得分:1)

//*[contains(.,"Tony's Computer")]

适合我。在字符串外部使用双引号。

答案 2 :(得分:1)

首先,这取决于您的宿主语言(在您的情况下是Java,对于许多其他人XSLT),因为您不仅要考虑哪些字符在XPath中是特殊的,而且在您的宿主语言中是特殊的。一般规则是,编写满足XPath规则的表达式,然后使用宿主语言转义来满足宿主语言规则(例如,Java中的 Error in t.test(y[x == 1], y[x == 0]) : promise already under evaluation: recursive default argument reference or earlier problems? 变为"。主机语言转义不会帮助您超越XPath规则,因为当XPath看到字符串时,主机语言转义已经消失。

XPath允许您使用\"'作为字符串分隔符,因此如果字符串中只出现其中一个字符,则可以使用另一个作为分隔符:{{1} }或"。对于其中任何一个,如果您使用的是Java,则可以将"Tony's Computer"替换为'He said "boo!"'(如果您使用的是XSLT,则将"替换为\")。

XPath 2.0还允许您通过加倍使用字符串文字中的分隔引用,如果您需要在同一字符串中使用两种引用,这很有用:"&quot;(再次然后,您必须添加Java级别的转义。)这在1.0中是不可能的,但您可以使用"He said, ""I can't"""'He said, "I can''t"'来解决这个问题。