2010-09-30 9 views
1

J'utilise xpath et LibXML dans une application iPhone pour trouver des nœuds dans un document XML. Je suis un noob dans xpath donc probablement je fais quelque chose de mal. Voici le xml:LibXML ne trouve aucun nœud pour mon expression xpath


<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
    <GetUserByEmailResponse xmlns="http://tempuri.org/"> 
     <GetUserByEmailResult> 
     <id>4006</id> 
     <name>Kudor Gyozo</name> 
     <email/> 
     <image/> 
     <facebookId>0</facebookId> 
     </GetUserByEmailResult> 
    </GetUserByEmailResponse> 
    </soap:Body> 
</soap:Envelope> 

L'expression XPath est //GetUserByEmailResult. Aucun noeud n'est renvoyé. Je m'attends à obtenir <GetUserByEmailResult> de retour. Si je teste la même chose here cela fonctionne bien. UPDATE1: Voici ce que je reçois d'un service web .net. Y at-il un moyen d'ignorer les espaces de noms dans libxml?

Répondre

2

l'élément GetUserByEmailResult est dans l'espace de noms http://tempuri.org/ de sorte que vous devrez ajouter cet espace à votre recherche XPath.

Vous pouvez le faire en utilisant la fonction xmlXPathRegisterNs:

xmlXPathRegisterNs(context, BAD_CAST "temp", BAD_CAST "http://tempuri.org/"); 

Ensuite, votre XPath devrait être changé pour

//temp:GetUserByEmailResult 
+0

Oui, cela fonctionne merci beaucoup. BTW existe-t-il un moyen d'ignorer les espaces de noms? –

+0

@kudor gyozo: Oui, vous pouvez ignorer les espaces de noms en vérifiant seulement les noms locaux dans vos expressions XPath comme suggéré dans la réponse de Wrikken. –

3

Je ne suis pas familier avec la bibliothèque iphone, mais vous devrez probablement déclarer quelque part le namsepace/prefix: Si vous enregistrez 'http://tempuri.org/' avec 'someprefix', vous pouvez rechercher :

//someprefix:GetUserByEmailResult 

Une solution possible est (mais pas conseillé):

//*[local-name()='GetUserByEmailResult'] 
Questions connexes