2010-10-26 4 views
9

J'ai un peu de mal à analyser XML à partir d'une réponse Google Checkout. Le XML vient directement du serveur google donc il n'y a pas de problème avec le XML lui-même.SimpleXmlElement et XPath, obtention d'un tableau vide()

Je veux mettre la main sur toutes les balises nouvelle commande-notification

J'ai essayé, mais obtenir un tableau vide() retourné à chaque fois.

$xml = new SimpleXmlElement($raw_xml); 
$notifications = $xml->xpath('notifications'); 
$notifications = $xml->xpath('/notification-history-response/notifications/new-order-notification'); 
$notifications = $xml->xpath('//new-order-notification'); 

Un XML snipet (Juste le début)

<notification-history-response xmlns="http://checkout.google.com/schema/2" serial-number="c5cda190-0eb1-4f91-87cd-e656e5598d38"> 
    <notifications> 
    <new-order-notification serial-number="271578974677716-00001-7"> 
     <buyer-billing-address> 
     <address1>19 sandbox st</address1> 
     <address2></address2> 
+0

* Le XML vient directement du serveur google, donc il n'y a pas de problème avec le XML lui-même. * Oui, google est presque comme @Jon Skeet à cet égard. Leur XML est bien formé par définition. ;-) – LarsH

Répondre

14

La question est sans doute l'espace de noms par défaut. Voir

Exemple:

$sxe->registerXPathNamespace('x', 'http://checkout.google.com/schema/2'); 
$result = $sxe->xpath('//x:notifications'); 

Comme alternative, s'il n'y a pas d'autres espaces de noms, supprimer simplement la valeur par défaut espace de nom avec

str_replace('xmlns="http://checkout.google.com/schema/2"', '', $raw_xml); 

avant d'envoyer le code XML à votre SimpleXmlElement.

+4

+1 bonne explication et exemple pratique. Les gens, s'il vous plaît prenez le temps de comprendre les espaces de noms. Ils ne sont pas si durs, et il est vraiment plus facile à long terme de les comprendre que d'essayer continuellement de les esquiver. – LarsH