2010-10-05 13 views
0

Après avoir fait des recherches sur SO et google pendant des heures maintenant ... J'espère obtenir de l'aide ici: (Je suis juste à un pas de l'exécution d'un regex pour enlever les espaces de noms complètement)Utilisation de xpath sur un objet PHP SimpleXML, namespaces SOAP + (ne fonctionne pas ..)

d'abord c'est le XML:

<?xml version="1.0" encoding="utf-16"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Header xmlns="http://webservices.site.com/definitions"> 
    <SessionId>0119A|1</SessionId> 
    </soap:Header> 
    <soap:Body> 
    <Security_AuthenticateReply xmlns="http://xml.site.com/QQ"> 
     <processStatus> 
     <statusCode>P</statusCode> 
     </processStatus> 
    </Security_AuthenticateReply> 
    </soap:Body> 
</soap:Envelope> 

voici maintenant ce que mon code en PHP ressemble:

$response = simplexml_load_string($str ,NULL, 
false, "http://schemas.xmlsoap.org/soap/envelope/"); 
// just making sure the name space is "registered" 
// but I tested all examples also with this removed 
$response->registerXPathNamespace("soap", 
    "http://schemas.xmlsoap.org/soap/envelope/"); 
$_res = $response->xpath('//soap:Header'); 
print_r($_res); 
/*** result: simple query for the root "soap" namespace, this looks good! (so far..) 
Array 
(
    [0] => SimpleXMLElement Object 
     (
      [SessionId] => 0119A|1 
     ) 

) 
***/ 

// now we query for the "SessionId" element in the XML 
$_res = $response->xpath('//soap:Header/SessionId'); 
print_r($_res); 
/*** result: this does not return anything! 
Array 
(
) 
***/ 

// another approach 
$_res = $response->xpath('//soap:Header/SessionId/text()'); 
print_r($_res); 
/*** result: this does not return anything at all! 
***/ 

// Finally, without using XPath this does work 
$_res = $response->xpath('//soap:Header'); 
$_res = (string)$_res[0]->SessionId; 
echo $_res; 
/*** result: this worked 
0119A|1 
***/ 

Comment puis-je obtenir le SO Message AP travaillant avec XPATH ???

Merci, Roman

+0

Le plus simple serait d'utiliser DOM au lieu de SimpleXML, mais je suppose que ce n'est pas une option? – Gordon

+0

Je trouve que lorsque je change cette partie du XML: Pour: Le dit des requêtes XPath commencent à travailler .. Des pensées à ce sujet? mauvais format du XML ?? –

Répondre

2

Les multiples espaces de noms sont de jouer avec elle, en ajoutant les œuvres suivantes pour moi

$response->registerXPathNamespace("site", "http://webservices.site.com/definitions"); 
$_res = $response->xpath('//site:SessionId'); 

aussi, voir this pile précédente question de débordement

+0

Les deux réponses étaient bonnes, puisque vous étiez le plus rapide (d'une minute) je l'ai choisi comme bonne réponse :) –

1

Vous devez enregistrer l'espace de noms par défaut utilisé par <SessionId> élément aussi bien. Parce que <SessionId> est dans l'espace de noms par défaut, il n'a pas de préfixe, mais pour que votre XPath fonctionne, vous devez également lier cet espace de noms à un préfixe, puis utiliser ce préfixe dans votre expression XPath.

$response->registerXPathNamespace("ns", 
    "http://webservices.site.com/definitions"); 
$_res = $response->xpath('//soap:Header/ns:SessionId'); 

XPath (1.0) expressions sans préfixe d'espace de noms correspondent toujours uniquement à des cibles en sans espace de nommage.

+0

+1 Pour la bonne réponse ** et l'explication ** –