program story

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

inputbox 2020. 11. 13. 08:09
반응형

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 기능이 있습니까? PHP 기능과 같은 다른 솔루션도 허용됩니다.


XPath 2에는 소문자 (및 대문자) 문자열 함수가 있습니다. 대소 문자를 구분하지 않는 것과 같지는 않지만 충분히 가까울 것입니다.

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

XPath 1을 사용하는 경우 translate를 사용 하는 해킹이 있습니다.


matches () 는 대소 문자를 구분하지 않는 정규식 일치를 허용하는 XPATH 2.0 함수입니다.

의 한 플래그 입니다 i대소 문자를 구별 매칭.

대소 문자를 구분하지 않는 플래그와 함께 matches () 함수를 사용하는 다음 XPATH :

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

가능한 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")];

Chrome 개발자 도구에서 요소를 찾을 수 없습니다. 화면에서 '제출'버튼을 찾고 있습니다.

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

그러나 '번역'을 사용하여 모든 대문자를 아래와 같이 작은 작품으로 대체합니다.

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

업데이트 : '일치'가 작동하지 않는 이유를 방금 찾았습니다. 구문 '일치'를 이해하지 못하는 xpath 1.0과 함께 Chrome을 사용하고 있습니다. xpath 2.0이어야합니다.


PHP 솔루션이 수용 가능하다고 언급했으며 PHP는 XPath v1.0 만 지원하더라도이를 수행 할 수있는 방법을 제공합니다. PHP 함수 호출을 허용하도록 XPath 지원을 확장 할 수 있습니다.

$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

반응형