XPath에서 대소문자를 구분하지 않는 일치?
예를 들어 아래 XML의 경우
<CATALOG>
<CD title="Empire Burlesque"/>
<CD title="empire burlesque"/>
<CD title="EMPIRE BURLESQUE"/>
<CD title="EmPiRe BuRLeSQuE"/>
<CD title="Others"/>
<CATALOG>
xpath와 같이 처음 4개의 레코드를 맞추는 방법//CD[@title='empire burlesque']
. 이것을 할 수 있는 expath 기능이 있습니까?PHP 기능과 같은 다른 솔루션도 허용됩니다.
XPath 2에는 소문자(그리고 대문자) 문자열 기능이 있습니다.이것은 대소문자를 구분하지 않는 것과 완전히 같지는 않지만, 충분히 가깝기를 바랍니다.
//CD[lower-case(@title)='empire burlesque']
XPath 1을 사용하는 경우 번역기를 이용한 해킹이 발생합니다.
matches()는 대소문자를 구분하지 않는 regex 일치를 허용하는 XPATH 2.0 함수입니다.
깃발 중 하나는i
대소문자 구분 없이 일치합니다.
대소문자를 구분하지 않는 플래그와 matchs() 함수를 사용하는 다음 XPATH:
//CD[matches(@title,'empire burlesque','i')]
Chrome Developer 도구에서 요소를 찾을 수 없습니다. 화면에서 '제출' 버튼을 찾고 있습니다.
//input[matches(@value,'submit','i')]
그러나 'translate'를 사용하여 모든 캡을 작은 것으로 교체하면 아래와 같습니다.
//input[translate(@value,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz') = 'submit']
업데이트: 방금 '성냥'이 작동하지 않는 이유를 찾았습니다.저는 xpath 1.0과 함께 크롬을 사용하고 있는데, 이는 'matches'라는 구문을 이해하지 못합니다.xpath 2.0이어야 합니다.
한 가지 가능한 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")];
셀레늄 xpath 하부 케이스가 작동하지 않습니다...번역이 사례 1에 도움이 될 것입니다.
- 속성 //*[번역(@id, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefGHIJKLMNOPQRSTUVWXYZ')='login_field']
- 임의의 속성을 사용하여 //[번역(@'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefGHIJKLMnopqrstuvwxyz')='login_field']
사례 2 : (포함) //[포함(translate(@id, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz', 'login_field')]
case 3 : Text property //*[포함(text()), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefGHIJKlmnopqrstuvwxyz', '사용자명')]
당신은 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"은 문자열 평가를 위한 것임을 보여줍니다.
언급URL : https://stackoverflow.com/questions/2893551/case-insensitive-matching-in-xpath
'programing' 카테고리의 다른 글
음의 부동 소수점 값을 부호 없는 int로 변환할 때의 동작은 무엇입니까? (0) | 2023.10.04 |
---|---|
Git: 전체 git 내역에 걸쳐 지정된 파일의 한 줄에 대한 다양한 변경 사항을 모두 표시합니다. (0) | 2023.10.04 |
PowerShell의 정규식 일치 (0) | 2023.10.04 |
Docker에서 영구 스토리지(예: 데이터베이스)를 처리하는 방법 (0) | 2023.10.04 |
phphmyadmin에서 트리거를 만드는 중 오류 발생 (0) | 2023.10.04 |