我无法弄清楚如何使用XPATH搜索包含单引号的文本。
例如,我在这个问题的标题中添加了引号。以下一行
$x("//*[text()='XQuery looking for text with 'single' quote']")
返回一个空数组。
但是,如果我尝试以下
$x("//*[text()=\"XQuery looking for text with 'single' quote\"]")
它确实返回了页面标题的链接,但我希望能够接受单引号和双引号,所以我不能只为单/双引号定制它。
您可以在此页面的chrome或firebug控制台中试用它。
答案 0 :(得分:13)
这是一个hackaround(感谢Dimitre Novatchev),它允许我搜索xpath中的任何文本,无论它是否包含单引号或双引号。在JS中实现,但可以很容易地翻译成其他语言
function cleanStringForXpath(str) {
var parts = str.match(/[^'"]+|['"]/g);
parts = parts.map(function(part){
if (part === "'") {
return '"\'"'; // output "'"
}
if (part === '"') {
return "'\"'"; // output '"'
}
return "'" + part + "'";
});
return "concat(" + parts.join(",") + ")";
}
如果我正在寻找I'm reading "Harry Potter"
,我可以执行以下操作
var xpathString = cleanStringForXpath( "I'm reading \"Harry Potter\"" );
$x("//*[text()="+ xpathString +"]");
// The xpath created becomes
// //*[text()=concat('I',"'",'m reading ','"','Harry Potter','"')]
这是一个(更短的)Java版本。如果删除类型信息,它与JavaScript完全相同。感谢https://stackoverflow.com/users/1850609/acdcjunior
String escapedText = "concat('"+originalText.replace("'", "', \"'\", '") + "', '')";!
答案 1 :(得分:6)
在XPath 2.0和XQuery 1.0中,字符串文字的分隔符可以通过加倍来包含在字符串文字中:
let $a := "He said ""I won't"""
或
let $a := 'He said "I can''t"'
约定来自SQL。
答案 2 :(得分:5)
这是一个例子:
/*/*[contains(., "'") and contains(., '"') ]/text()
将此XPath表达式应用于以下XML文档时:
<text>
<t>I'm reading "Harry Potter"</t>
<t>I am reading "Harry Potter"</t>
<t>I am reading 'Harry Potter'</t>
</text>
选择了想要的正确结果(单个文本节点):
I'm reading "Harry Potter"
以下是使用XPath Visualizer 进行的验证(我在12年前创建的免费开源工具,它已经让XPath成为了成千上万人的有趣方式):
您的问题可能是您无法将此XPath表达式指定为您正在使用的编程语言中的字符串 - 这不是XPath问题,而是您对编程语言知识的问题。
答案 3 :(得分:1)
此外,如果你使用XQuery而不是XPath,正如标题所说,你也可以使用xml实体:
"" for double and ' for single quotes"
它们也可以在单引号中使用
答案 4 :(得分:1)
您可以使用正则表达式执行此操作。例如(作为ES6代码):
export function escapeXPathString(str: string): string {
str = str.replace(/'/g, `', "'", '`);
return `concat('${str}', '')`;
}
这将用'
替换输入字符串中的所有', "'", '
。
最终, ''
很重要,因为concat('string')
是错误。
答案 5 :(得分:0)
嗯,我在同一个任务中,过了一会儿,我发现xpath没有支持这个,安静令人失望!但我们总能解决它!
我想要一些简单而直接的东西。我带来的是设置你自己的撇号替换,一种独特的代码(你在xml文本中不会遇到的东西),我选择了//'// 例如。现在你将它放在xml文本和xpath查询中。 (对于xml,你没有写,我们总是可以用任何编辑器的替换功能替换)。 现在我们怎么办?我们正常搜索,检索结果,并将// //替换为&#39;。
从我正在做的事情中得到一些样本:(replace_special_char_xpath()就是你需要做的)
function repalce_special_char_xpath($str){
$str = str_replace("//apos//","'",$str);
/*add all replacement here */
return $str;
}
function xml_lang($xml_file,$category,$word,$language){ //path can be relative or absolute
$language = str_replace("-","_",$language);// to replace - with _ to be able to use "en-us", .....
$xml = simplexml_load_file($xml_file);
$xpath_result = $xml->xpath("${category}/def[en_us = '${word}']/${language}");
$result = $xpath_result[0][0];
return repalce_special_char_xpath($result);
}
xml文件中的文字:
<def>
<en_us>If you don//apos//t know which server, Click here for automatic connection</en_us> <fr_fr>Si vous ne savez pas quelle serveur, Cliquez ici pour une connexion automatique</fr_fr> <ar_sa>إذا لا تعرفوا أي سرفير, إضغطوا هنا من أجل إتصال تلقائي</ar_sa>
</def>
和php文件中的调用(生成的html):
<span><?php echo xml_lang_body("If you don//apos//t know which server, Click here for automatic connection")?>