8

我不知道如何使用 XPATH 搜索包含单引号的文本。

例如,我在此问题的标题中添加了引号。以下行

$x("//*[text()='XQuery looking for text with 'single' quote']")

返回一个空数组。

但是,如果我尝试以下

$x("//*[text()=\"XQuery looking for text with 'single' quote\"]")

它确实返回页面标题的链接,但我希望能够在其中接受单引号和双引号,所以我不能只为单/双引号定制它。

您可以在此页面上的 chrome 或 firebug 控制台中尝试它。

4

6 回答 6

13

这是一个hackaround(感谢Dimitre Novatchev),它可以让我搜索xpaths中的任何文本,无论它包含单引号还是双引号。用 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("'", "', \"'\", '") + "', '')";!
于 2012-11-20T22:44:26.880 回答
8

在 XPath 2.0 和 XQuery 1.0 中,字符串文字的分隔符可以通过加倍包含在字符串文字中:

let $a := "He said ""I won't"""

或者

let $a := 'He said "I can''t"'

该约定是从 SQL 借来的。

于 2012-11-21T14:01:06.210 回答
6

这是一个例子

/*/*[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 问题,而是您对编程语言的了解方面的问题。

于 2012-11-20T21:37:26.770 回答
1

此外,如果您使用的是 XQuery,而不是 XPath,如标题所述,您还可以使用 xml 实体:

   "&quot; for double and &apos; for single quotes"

它们也可以在单引号内工作

于 2012-11-21T14:53:32.050 回答
1

您可以使用正则表达式来执行此操作。例如(作为 ES6 代码):

export function escapeXPathString(str: string): string {
    str = str.replace(/'/g, `', "'", '`);

    return `concat('${str}', '')`;
}

'这会将输入字符串中的所有内容替换为', "'", '.

final, ''很重要,因为concat('string')它是一个错误。

于 2015-09-09T06:48:12.327 回答
0

好吧,我在同一个任务中,过了一会儿我发现在 xpath 中没有对此的支持,安静令人失望!但是,我们总是可以解决它!

我想要一些简单而直接的东西。我附带的是为撇号设置您自己的替换,这是一种独特的代码(您在 xml 文本中不会遇到的东西),例如,我选择了 //apos//。现在你把它放在你的 xml 文本和你的 xpath 查询中。(如果你不是总是写 xml,我们可以用任何编辑器的替换功能替换)。现在我们怎么办?我们用这个正常搜索,检索结果,然后将 //apos// 替换回 '.

下面是我正在做的一些示例:(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")?>
于 2017-05-24T13:37:19.990 回答