【问题标题】:Using an xpath to find text with an apostrophe ( " ' ") [duplicate]使用 xpath 查找带有撇号(“'”)的文本 [重复]
【发布时间】:2017-08-07 15:22:28
【问题描述】:

我进行了研究和研究,但似乎没有任何效果。假设我想要一个带有文本“托尼的电脑”的 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 display = ele.getText();然后检查displayed.contains(textToLookFor)。

在这种情况下,我首先需要执行 textToLookFor = textToLookFor.replaceAll("\"", "\\\""); 转义任何双引号。

【问题讨论】:

  • 他们建议使用 " 而不是 ',或者使用 \' 但这对我不起作用。“他们”是指上述可能的重复 ;-)
  • 您使用的是 XPath 1.0 吗?
  • @Tony 你应该发布你的代码来展示你如何实现“他们的”建议。怎么样:String xpath = "//*[contains(.,\"Tony's Computer\")]";

标签: java xpath


【解决方案1】:

首先,这在一定程度上取决于您的宿主语言(在您的情况下是 Java,对于许多其他人来说是 XSLT),因为您不仅要考虑哪些字符在 XPath 中是特殊的,而且在您的宿主语言中是特殊的。一般规则是,编写一个满足 XPath 规则的表达式,然后使用宿主语言转义来满足宿主语言规则(例如," 在 Java 中变为 \")。宿主语言转义不会帮助您通过 XPath 规则,因为当 XPath 看到字符串时,宿主语言转义已经消失。

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

XPath 2.0 还允许您通过加倍在字符串文字中使用定界引号,如果您需要在同一字符串中使用两种引号:"He said, ""I can't"""'He said, "I can''t"'(同样,您有添加 Java 级别的转义。)这在 1.0 中是不可能的,但您可以使用 concat(): concat("He said, ", '"', "I can't", '"') 绕过它。

【讨论】:

  • 是的,我确实用 \ 转义了双引号(例如“\”Tony's Computer\""。也许我们仍在使用 xpath 1.0?我还尝试使用反斜杠(如 contains(text (),'托尼的电脑')].
  • 如果它不起作用,请告诉我们您在做什么以及它是如何失败的。如果它有效,则接受答案。
【解决方案2】:
//*[contains(.,"Tony's Computer")]

为我工作。在字符串外部使用双引号。

【讨论】:

    【解决方案3】:

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

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

    双撇号应该在 XSLT 2.0 中起作用。因此,另一种选择是使用Saxon as your XPath engine,然后使用 XPath 2.0,那么以下方法将起作用:

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

    【讨论】:

    • 我们无法更改 xpath 引擎。好吧,我必须得到 IT 的许可。我不认为我已经尝试过 apos。明天我回来工作时我会试试看。
    猜你喜欢
    • 2018-08-14
    • 1970-01-01
    • 2015-09-14
    • 2010-11-23
    • 2011-10-09
    • 1970-01-01
    • 2012-08-22
    • 2018-12-16
    • 1970-01-01
    相关资源
    最近更新 更多