Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用xpath查找带有撇号(“x27”)的文本_Java_Xpath - Fatal编程技术网

Java 使用xpath查找带有撇号(“x27”)的文本

Java 使用xpath查找带有撇号(“x27”)的文本,java,xpath,Java,Xpath,我研究了又研究,但似乎什么都不管用。假设我想要一个带有文本“Tony's Computer”的xpath。我无法做到以下几点: //*[contains(text(), 'Tony's Computer')] 由于显而易见的原因,因为y和s之间的“取消引用文本”。但这也不起作用: //*[contains(text(), 'Tony\'s Computer')] 也 有没有办法避开撇号?我什么也找不到。我能用Java做的最好的事情是(假设textToLookFor有要查找的文本): 我想这已

我研究了又研究,但似乎什么都不管用。假设我想要一个带有文本“Tony's Computer”的xpath。我无法做到以下几点:

//*[contains(text(), 'Tony's Computer')]
由于显而易见的原因,因为y和s之间的“取消引用文本”。但这也不起作用:

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

有没有办法避开撇号?我什么也找不到。我能用Java做的最好的事情是(假设textToLookFor有要查找的文本):

我想这已经足够好了。然而,这并不完全匹配。例如,它可以找到“托尼和鲍勃的电脑”

还有其他人成功地做到了这一点吗?我找不到其他解决办法。 顺便说一下,当我找到元素时,我可以说String displayed=ele.getText();然后检查显示的.contains(textToLookFor)


在本例中,我首先需要执行textToLookFor=textToLookFor.replaceAll(“\”,“\ \”);它将转义任何双引号。

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

//*[contains(text(), 'Tony's Computer')]
在XSLT2.0中,将单撇号加倍应该是可行的。因此,另一种选择是先使用XPath 2.0,然后再使用XPath 2.0,那么下面的方法就可以了:


对我有用。在字符串外部使用双引号。

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

XPath允许您使用
作为字符串分隔符,因此,如果字符串中只显示其中一个字符,则可以使用另一个字符作为分隔符:
“Tony的计算机”
”他说“boo!“
。使用这两种方法中的任何一种,如果您使用的是Java,则将
替换为
(如果您使用的是XSLT,则将
替换为


XPath 2.0还允许您在字符串文字中使用分隔引号,方法是将其加倍,如果您需要在同一字符串中同时使用两种引号,这将非常有用:
“他说”、“我不能”
,或者
“他说,”我不能”
(同样,您必须添加Java级别的转义)这在1.0中是不可能的,但是你可以通过使用
concat()
concat(“他说,,,,,,,,,,,,,,”)

他们建议使用“代替”,或使用\”,但这对我不起作用。我所说的“他们”是指上述可能的重复;-)您正在使用XPath 1.0吗?@Tony您应该发布代码,说明如何实现“他们”的建议。怎么样:
stringxpath=“/*[包含(,,“托尼的电脑”)”?是的,我确实用\(例如“\”Tony's Computer\”来转义双引号。也许我们仍然在使用xpath 1.0?我还尝试了反斜杠单引号(如contains(text(),“Tony's Computer”)]。如果它不起作用,请告诉我们您正在做什么以及它是如何失败的。如果它起作用,请接受答案。我们无法更改xpath引擎。我必须获得它的许可。我想我没有尝试过apos。我明天回来工作时会尝试。
        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')]
//*[contains(text(), 'Tony&apos;s Computer')]
//*[contains(text(), 'Tony''s Computer')]
//*[contains(.,"Tony's Computer")]