2010-06-11 3 views
5

Après avoir dépensé PLUSIEURS heures frustrées à ce sujet, je demande votre aide. J'essaie d'obtenir le contenu de nœuds particuliers à partir d'une réponse SOAP.Réponses SOX de SimpleXML Problèmes d'espace de noms

La réponse est

<?xml version="1.0" encoding="UTF-8"?> 
<env:Envelope xmlns:env="<a href="http://www.w3.org/2003/05/soap-envelope">http://www.w3.org/2003/05/soap-envelope</a>"<xmlns:ns1="<a href="http://soap.xxxxxx.co.uk/">http://soap.xxxxxx.co.uk/</a>"> 
    <env:Body> 
     <ns1:PlaceOrderResponse> 
      <xxxxxOrderNumber></xxxxxOrderNumber> 
      <ErrorArray> 
       <Error> 
        <ErrorCode>24</ErrorCode> 
        <ErrorText>The+client+order+number+3002254+is+already+in+use</ErrorText> 
       </Error> 
       <Error> 
        <ErrorCode>1</ErrorCode> 
        <ErrorText>Aborting</ErrorText> 
       </Error> 
      </ErrorArray> 
     </ns1:PlaceOrderResponse> 
    </env:Body> 
</env:Envelope> 

Je suis en train de faire les nœuds et les enfants de < ErrorArray>. En raison des espaces de noms contenant XML

$XmlArray = new SimpleXMLElement($XmlStr); 

foreach ($XmlArray->env:Envelope->env:Body->ns1:PlaceOrderResponse->ErrorArray->Error as $Error) 
{ 
    echo $Error->ErrorCode."<br />"; 
} 

ne fonctionne pas. J'ai lu un certain nombre d'articles tels que

et environ 20 questions sur ce site, qui ne sont pas aider malheureusement.

Même l'écriture,

$XmlArray = new SimpleXMLElement($XmlStr); 

echo "<br /><br /><pre>\n"; 
print_r($XmlArray); 
echo "<pre><br /><br />\n"; 

donne

SimpleXMLElement Object 
(
) 

qui me fait me demande si la réponse du savon (XmlStr $) est en fait une entrée valable pour SimpleXMLElement.

Il semble que la ligne

$XmlArray = new SimpleXMLElement($XmlStr); 

ne fait pas ce que je pense à.

Toute aide sur la façon d'obtenir les nœuds à partir du XML ci-dessus serait la bienvenue. De toute évidence, le faire fonctionner (avoir un exemple de travail) est ce dont j'ai besoin à court terme, mais si quelqu'un pouvait m'aider à comprendre ce que je fais de mal serait mieux à long terme.

Cheers. Stu

Répondre

12

Vous devez utiliser SimpleXMLElement::children(), bien qu'à ce stade il serait probablement plus facile d'utiliser XPath.

<?php 
    $XmlStr = <<<XML 
<?xml version="1.0" encoding="UTF-8"?> 
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://soap.xxxxxx.co.uk/" > 
    <env:Body> 
     <ns1:PlaceOrderResponse> 
      <xxxxxOrderNumber></xxxxxOrderNumber> 
      <ErrorArray> 
       <Error> 
        <ErrorCode>24</ErrorCode> 
        <ErrorText>The+client+order+number+3002254+is+already+in+use</ErrorText> 
       </Error> 
       <Error> 
        <ErrorCode>1</ErrorCode> 
        <ErrorText>Aborting</ErrorText> 
       </Error> 
      </ErrorArray> 
     </ns1:PlaceOrderResponse> 
    </env:Body> 
</env:Envelope> 
XML; 

    $XmlArray = new SimpleXMLElement($XmlStr); 

    $t = $XmlArray->children("env", true)->Body-> 
     children("ns1", true)->PlaceOrderResponse-> 
     children()->ErrorArray->Error; 
    foreach ($t as $error) { 
     echo $error->ErrorCode, " " , $error->ErrorText, "<br />"; 
    } 

donne:

 
24 The+client+order+number+3002254+is+already+in+use 
1 Aborting 
+0

MERCI !, je suis si proche. J'avais déjà regardé dans la méthode children() et utilisais ce foreach ($ XmlArray-> enfants ('env', true) -> Enveloppe-> enfants ('env', true) -> Corps- > enfants ('ns1', true) -> PlaceOrderResponse-> ErrorArray-> Erreur en $ Error) Encore une fois, merci :-) Ps quelles sont les balises pour formater correctement le code sur stackoverflow? Je ne pouvais pas le trouver sur le côté. – Stu

+0

@Stu Il vous suffit d'appuyer sur le bouton 0101 avec votre code sélectionné. En passant, si la réponse était vraiment satisfaisante, vous devriez l'accepter. – Artefacto

0

Un moyen pas cher et méchant est juste simplement supprimer les préfixes:

$xml = preg_replace('%<(\/)?(\S+):(\w+)%', '<$1$3', $xml); 
Questions connexes