без урахування регістру збіг у xpath?


78

Наприклад, для xml нижче

<CATALOG>
    <CD title="Empire Burlesque"/>
    <CD title="empire burlesque"/>
    <CD title="EMPIRE BURLESQUE"/>
    <CD title="EmPiRe BuRLeSQuE"/>
    <CD title="Others"/>
<CATALOG>

Як зіставити перші 4 записи із xpath like //CD[@title='empire burlesque']. Чи існує функція xpath для цього? Інші рішення, такі як функція PHP, також приймаються.


1
stackoverflow.com/questions/586231 / ... перевірити бен gripka Почати для XPath 1,0
user2237201

Тут я також знайшов ще 2 рішення з описом: (не мій сайт / просування) codingexplained.com/coding/php/…
bharat

Відповіді:


115

XPath 2 має функцію рядкової рядкової літери (та великої). Це не зовсім те саме, що не враховує регістр, але, сподіваємось, це буде досить близько:

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

Якщо ви використовуєте XPath 1, існує хакерство за допомогою перекладу .


Навіть працює в запитах XPath SQL Server щодо стовпців XML. Відмінно.
TJ Crowder

55

match () - це функція XPATH 2.0, яка дозволяє збігати регулярні вирази без урахування регістру.

Один із прапорів призначений iдля відповідності без урахування регістру.

Наступний XPATH із використанням функції match () із чутливим до регістру прапором:

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

14
Це на основі регулярних виразів, що є важливою відмінністю від відповідності на основі тексту.
usr

12

Це не працює в інструментах розробника Chrome для пошуку елемента, я шукаю кнопку "Надіслати" на екрані

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

Однак використання «перекладу» замінює всі обмеження на невеликі твори, як показано нижче

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

Оновлення: Я щойно знайшов причину, чому "збіги" не працюють. Я використовую Chrome із xpath 1.0, який не розуміє синтаксис "збігів". Це має бути xpath 2.0


Здається, концепція перекладу називається `` нечутливим до регістру '' щодо інтернаціоналізації
neaumusic

9

Одне з можливих рішень 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")];

12
Анонімному виборцеві: Прочитайте питання OP. Особливо "Також приймаються інші рішення, такі як функція PHP". частина.
Томалак

3

Ви згадали, що рішення 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" - для оцінки рядків.


0

для селену xpath мала літера не буде працювати ... Переклад допоможе Випадок 1:

  1. за допомогою атрибута // * [перекласти (@ id, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = 'поле_входу']]
  2. Використовуючи будь-який атрибут // [перекласти (@ , 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = 'поле_входу']]

Випадок 2: (з містить) // [містить (перекласти (@ id, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'login_field')]]

випадок 3: для властивості Text // * [містить (перекласти (text (), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'ім'я користувача))]


QA Automator - це інструмент управління автоматизацією на хмарній платформі, де ви можете створювати, виконувати та обслуговувати тестові сценарії автоматизації https://www.youtube.com/watch?v=iFk1Na_627U&t=53s

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.