2009-06-05 20 views
2

Je ne veux pas que la recherche de la valeur de chaîne soit insensible à la casse. Je veux faire une recherche pour le noeud sans tenir compte de la sensibilité à la casse. Si le XML ressemble à ceci:Comment effectuer une recherche insensible à la casse pour un noeud dans PHP xpath?

<items> 
    <ITEM>My text!</ITEM> 
</items> 

je besoin de quelque chose comme cela fonctionne:

$someXmlDoc->xpath("/items/item/text()"); 

Actuellement, seulement cela fonctionne:

$someXmlDoc->xpath("/items/ITEM/text()"); 
+1

double: http://stackoverflow.com/questions/625986/how-can-i-use-xpath-to-perform-a-case-insensitive-search-and -support-non-anglais La réponse est déjà là :) –

+1

Salut Bjorn - J'ai vu cela, mais il semblait que cela fournissait une réponse pour une case insensible sur une valeur de chaîne, pas un noeud, qui est ce que Je ne pouvais pas comprendre. –

Répondre

2

Il n'y a pas de conversion de cas en XPath 1.0 comme soutenu par php (voir http://jp.php.net/manual/en/class.domxpath.php)

vous pourrait utilisez la fonction de traduction, montrée ci-dessous dans un sens très limité. A noter: pas recommandée car elle ne fonctionnera pas pour les caractères non-anglais

/items/*[translate(node(),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz') = 'item']/text() 

vous pouvez aussi faire une union comme ci-dessous

/items/ITEM/text() | /items/item/text() 
+0

L'union fonctionne, mais la traduction ne fonctionne pas. J'accepte pour cette réponse. Merci :) –

0

C'est bizarre. Les balises XML sont sensibles à la casse (http://www.w3schools.com/xml/xml_syntax.asp), donc <item> et <ITEM> sont deux balises différentes. Ainsi. "/items/item/text()" et /items/ITEM/text() sont deux chemins différents.

<items> 
    <ITEM>My text!</ITEM> 
    <item>Your text!</item> 
</items> 

« Mon texte » et « Votre texte » ont différentes xpath s

0

Prendre votre previousquestions sur le même sujet en compte une autre question submerge: « At-il être xml » Que diriez-vous de JSON?
Pour coder les données JSON sur le client, vous pouvez utiliser jquery-json, qui ne prend que 2 Ko dans la version réduite

var jsondata = { 
    sender: "CATS", 
    subject: "All Your Base", 
    items: [] 
}; 
for(var i=0; i<8; i++) jsondata.items.push(i);

$.ajax({ url: " http://localhost/test.php ", type: "post", dataType: "json", data: $.toJSON(jsondata), contentType: "application/json; charset=utf-8",

Ensuite, votre script côté serveur php peut décoder les données avec json_decode(), et vous obtiendrez un tableau php natif/hachage en fonction de la représentation json de l'objet javascript/hash. Pour renvoyer des données au client, vous pouvez utiliser json_encode(). Vous obtenez une représentation json de votre tableau php et puisque dataType: "json" a été défini, jquery retournera un objet javascript natif contenant ces valeurs/propriétés.

0

Jonathan Fingland première variante n'a pas fonctionné pour moi non plus, mais j'ai finalement trouvé la solution.

Il devrait être

/items/*[translate(name(),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz') = 'item']/text() 
Questions connexes