Groß- und Kleinschreibung wird in xpath nicht berücksichtigt?

76

Zum Beispiel für die folgende XML

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

Wie man die ersten 4 Datensätze mit xpath like vergleicht //CD[@title='empire burlesque']. Gibt es dafür eine xpath-Funktion? Andere Lösungen wie die PHP-Funktion werden ebenfalls akzeptiert.

Ethan
quelle
1
stackoverflow.com/questions/586231/… Schauen Sie sich Ben Gripkas Beitrag für xpath 1.0 an
user2237201
Hier habe ich auch 2 weitere Lösungen mit Beschreibung gefunden: (nicht meine Website / Promotion) codingexplained.com/coding/php/…
bharat

Antworten:

113

XPath 2 verfügt über eine Zeichenfolgenfunktion in Kleinbuchstaben (und Großbuchstaben). Das ist nicht ganz das Gleiche wie ohne Berücksichtigung der Groß- und Kleinschreibung, aber hoffentlich ist es nah genug:

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

Wenn Sie XPath 1 verwenden, gibt es einen Hack mit translate .

Matthew Flaschen
quelle
Funktioniert sogar in XPath-Abfragen von SQL Server für XML-Spalten. Ausgezeichnet.
TJ Crowder
55

match () ist eine XPATH 2.0-Funktion, die eine Regex-Übereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung ermöglicht.

Eines der Flags dient izum Abgleichen ohne Berücksichtigung der Groß- und Kleinschreibung.

Der folgende XPATH verwendet die Funktion match () mit dem Flag ohne Berücksichtigung der Groß- und Kleinschreibung:

//CD[matches(@title,'empire burlesque','i')]
Mads Hansen
quelle
13
Dies ist Regex-basiert, was einen wichtigen Unterschied zum textbasierten Abgleich darstellt.
usr
12

Dies funktioniert in Chrome Developer-Tools nicht, um ein Element zu finden. Ich suche nach der Schaltfläche "Senden" auf dem Bildschirm

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

Verwenden Sie jedoch "Übersetzen", um alle Kappen durch kleine Werke wie unten zu ersetzen

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

Update: Ich habe gerade den Grund gefunden, warum "Übereinstimmungen" nicht funktionieren. Ich verwende Chrome mit xpath 1.0, das die Syntax "Übereinstimmungen" nicht versteht. Es sollte xpath 2.0 sein

Bhuvanesh Mani
quelle
Es scheint, dass das Übersetzungskonzept in Bezug auf die Internationalisierung als "
fallunabhängige
9

Eine mögliche PHP-Lösung:

// 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")];
Tomalak
quelle
11
An den anonymen Wähler: Lesen Sie die Frage des OP. Insbesondere die "Andere Lösungen wie die PHP-Funktion werden ebenfalls akzeptiert." Teil.
Tomalak
3

Sie haben erwähnt, dass PHP-Lösungen akzeptabel sind, und PHP bietet eine Möglichkeit, dies zu erreichen, obwohl es nur XPath v1.0 unterstützt. Sie können die XPath-Unterstützung erweitern, um PHP-Funktionsaufrufe zuzulassen.

$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"]');

Weitere Beispiele finden Sie in der Dokumentation zu PHP registerPhpFunctions . Es zeigt im Grunde, dass "php: function" für die boolesche Auswertung und "php: functionString" für die String-Auswertung ist.

jimp
quelle