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

时间:2010-05-23 21:32:51

标签: xml xpath

例如,对于下面的xml

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

如何将前4条记录与xpath(如//CD[@title='empire burlesque'])匹配。是否有xpath函数来执行此操作?其他解决方案,如PHP函数也被接受。

6 个答案:

答案 0 :(得分:96)

XPath 2具有小写(和大写)字符串函数。这与案例不敏感并不完全相同,但希望它足够接近:

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

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

答案 1 :(得分:49)

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

其中一个flagsi,用于不区分大小写的匹配。

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

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

答案 2 :(得分:9)

一种可能的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")];

答案 3 :(得分:7)

这在Chrome开发者工具中无法找到元素,我希望找到“提交”功能。屏幕上的按钮

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

然而,使用&#39;翻译&#39;将所有大写字母替换为小作品,如下所示

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

更新:我刚刚找到了为什么&#39;匹配&#39;不起作用。我正在使用Chrome与xpath 1.0,它不会理解语法&#39;匹配&#39;。它应该是xpath 2.0

答案 4 :(得分:2)

您提到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”用于字符串求值。

答案 5 :(得分:1)

对于 selenium xpath 小写将不起作用...翻译会有所帮助 案例一:

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

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

case 3 : 对于 Text 属性 //*[contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),'用户名')]


QA Automator 是云平台上的自动化管理工具,您可以在其中创建、执行和维护自动化测试脚本 https://www.youtube.com/watch?v=iFk1Na_627U&t=53s