例如,对于下面的 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 函数。
XPath 2 有一个小写(和大写)字符串函数。这与不区分大小写并不完全相同,但希望它足够接近:
//CD[lower-case(@title)='empire burlesque']
如果您使用的是 XPath 1,则有一个 hack using translate。
这在 Chrome 开发人员工具中无法定位元素,我正在寻找屏幕中的“提交”按钮
//input[matches(@value,'submit','i')]
但是,使用“翻译”将所有大写字母替换为小作品,如下所示
//input[translate(@value,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz') = 'submit']
更新:我刚刚找到了“匹配”不起作用的原因。我正在使用带有 xpath 1.0 的 Chrome,它不会理解语法“匹配”。它应该是 xpath 2.0
translate
解决方案不适用于对大写字母有特殊规则的语言(例如德语)。
一种可能的 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")];
您提到 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”用于字符串评估。
对于 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'),'用户名')]