ChatGPT解决这个技术问题 Extra ChatGPT

XPath 中不区分大小写的匹配?

例如,对于下面的 XML

<CATALOG>
    <CD title="Empire Burlesque"/>
    <CD title="empire burlesque"/>
    <CD title="EMPIRE BURLESQUE"/>
    <CD title="EmPiRe BuRLeSQuE"/>
    <CD title="Others"/>
<CATALOG>

如何将前 4 条记录与 //CD[@title='empire burlesque'] 等 xpath 匹配。是否有 xpath 功能可以做到这一点?也接受其他解决方案,如 PHP 函数。

stackoverflow.com/questions/586231/… 查看 ben gripka 关于 xpath 1.0 的帖子
在这里,我还找到了另外 2 个带有描述的解决方案:(不是我的网站/促销)codingexplained.com/coding/php/…

C
Community

XPath 2 有一个小写(和大写)字符串函数。这与不区分大小写并不完全相同,但希望它足够接近:

//CD[lower-case(@title)='empire burlesque']

如果您使用的是 XPath 1,则有一个 hack using translate


甚至适用于 SQL Server 对 XML 列的 XPath 查询。出色的。
M
Mads Hansen

matches() 是一个 XPATH 2.0 函数,允许进行不区分大小写的正则表达式匹配。

flags 之一是 i,用于不区分大小写的匹配。

以下 XPATH 使用带有不区分大小写标志的 matches() 函数:

//CD[matches(@title,'empire burlesque','i')]

这是基于正则表达式的,这是与基于文本的匹配的一个重要区别。
请注意,这也可能会找到部分匹配项;如果这不可接受,则使用 ^$,例如 matches(@title, '^empire burlesque$', 'i')
B
Bhuvanesh Mani

这在 Chrome 开发人员工具中无法定位元素,我正在寻找屏幕中的“提交”按钮

//input[matches(@value,'submit','i')]

但是,使用“翻译”将所有大写字母替换为小作品,如下所示

//input[translate(@value,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz') = 'submit']

更新:我刚刚找到了“匹配”不起作用的原因。我正在使用带有 xpath 1.0 的 Chrome,它不会理解语法“匹配”。它应该是 xpath 2.0


关于国际化,翻译概念似乎被称为“不区分大小写的排序规则”
另请记住,此答案中的 translate 解决方案不适用于对大写字母有特殊规则的语言(例如德语)。
T
Tomalak

一种可能的 PHP 解决方案:

// load XML to SimpleXML
$x = simplexml_load_string($xmlstr);

// index it by title once
$index = array();
foreach ($x->CD as &$cd) {
  $title = strtolower((string)$cd['title']); 
  if (!array_key_exists($title, $index)) $index[$title] = array();
  $index[$title][] = &$cd;
}

// query the index 
$result = $index[strtolower("EMPIRE BURLESQUE")];

致匿名投票者:阅读 OP 的问题。尤其是“也接受 PHP 函数等其他解决方案”。部分。
j
jimp

您提到 PHP 解决方案是可以接受的,尽管 PHP 只支持 XPath v1.0,但它确实提供了一种方法来实现这一点。您可以扩展 XPath 支持以允许 PHP 函数调用。

$xpathObj = new DOMXPath($docObj);
$xpathObj->registerNamespace('php','http://php.net/xpath'); // (required)
$xpathObj->registerPhpFunctions("strtolower"); // (leave empty to allow *any* PHP function)
$xpathObj->query('//CD[php:functionString("strtolower",@title) = "empire burlesque"]');

有关更多示例,请参阅 PHP registerPhpFunctions 文档。它基本上表明“php:function”用于布尔评估,“php:functionString”用于字符串评估。


J
Jean-François Fabre

对于 selenium xpath 小写将不起作用...翻译将有助于案例 1:

使用属性 //*[translate(@id,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='login_field'] 使用任何属性 //[translate(@,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='login_field']

案例 2 : (with contains) //[contains(translate(@id,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'login_field')]

案例3:对于文本属性//* [包含(翻译(文本(),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'用户名')]


你帮了我很多。非常感谢!