programing

XPath에서 대소문자를 구분하지 않는 일치?

bestprogram 2023. 10. 4. 22:12

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에 도움이 될 것입니다.

  1. 속성 //*[번역(@id, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefGHIJKLMNOPQRSTUVWXYZ')='login_field']
  2. 임의의 속성을 사용하여 //[번역(@'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