Java 使用xpath查找带有撇号(“x27”)的文本
我研究了又研究,但似乎什么都不管用。假设我想要一个带有文本“Tony's Computer”的xpath。我无法做到以下几点: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有要查找的文本): 我想这已
//*[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's Computer')]
//*[contains(text(), 'Tony''s Computer')]
//*[contains(.,"Tony's Computer")]