Par exemple, pour le xml ci-dessous
Comment faire correspondre les 4 premiers enregistrements avec xpath comme //CD[@title='empire burlesque']
. Y a-t-il la fonction xpath pour faire cela? D’autres solutions comme la fonction PHP sont également acceptées.
XPath 2 a une fonction de chaîne minuscule (et majuscule). Ce n’est pas tout à fait la même chose que la sensibilité à la casse, mais j’espère qu’elle sera assez proche:
//CD[lower-case(@title)='empire burlesque']
Si vous utilisez XPath 1, il existe un hack utilisant translate .
matches () est une fonction XPATH 2.0 qui permet une correspondance avec les regex insensibles à la casse.
L’un des indicateurs est i
pour la correspondance insensible à la casse.
Le XPATH suivant utilisant la fonction matches () avec l’indicateur insensible à la casse:
//CD[matches(@title,'empire burlesque','i')]
Une solution PHP possible:
// load XML to SimpleXML $x = simplexml_load_ssortingng($xmlstr); // index it by title once $index = array(); foreach ($x->CD as &$cd) { $title = strtolower((ssortingng)$cd['title']); if (!array_key_exists($title, $index)) $index[$title] = array(); $index[$title][] = &$cd; } // query the index $result = $index[strtolower("EMPIRE BURLESQUE")];
Cela ne fonctionne pas dans les outils de développeur Chrome pour localiser un élément, je cherche à localiser le bouton «Soumettre» dans l’écran
//input[matches(@value,'submit','i')]
Cependant, utiliser ‘translate’ pour remplacer tous les majuscules par des petits travaux comme ci-dessous
//input[translate(@value,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz') = 'submit']
Mise à jour: Je viens de trouver la raison pour laquelle «matches» ne fonctionne pas. J’utilise Chrome avec xpath 1.0 qui ne comprendra pas les syntaxes «correspondances». Ce devrait être xpath 2.0
Vous avez mentionné que les solutions PHP étaient acceptables, et PHP offre un moyen d’y parvenir même s’il ne prend en charge que XPath v1.0. Vous pouvez étendre le support XPath pour autoriser les appels de fonctions 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:functionSsortingng("strtolower",@title) = "empire burlesque"]');
Voir la documentation PHP registerPhpFunctions pour plus d’exemples. Il démontre fondamentalement que “php: function” est pour l’évaluation booléenne et “php: functionSsortingng” pour l’évaluation des chaînes.