2010-10-26 6 views
9

Ich habe ein wenig Probleme mit dem Parsen von XML aus einer Google Checkout-Antwort. Das XML kommt direkt vom Google-Server, sodass es kein Problem mit dem XML selbst gibt.SimpleXmlElement und XPath, leere Array erhalten()

will ich halten, alle neue Ordnung-Benachrichtigung Tags

ich schon versucht, diese zu bekommen, aber ein leeres Array() zurückgegeben jedes Mal bekommen.

$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'); 

Ein XML-snipet (nur der Anfang)

<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

* Das XML kommt direkt vom Google Server, also gibt es kein Problem mit dem XML selbst. * Ja, Google ist in dieser Hinsicht fast wie @Jon Skeet. Ihr XML ist per definitionem wohlgeformt. ;-) – LarsH

Antwort

14

Das Problem ist wahrscheinlich der Standard-Namespace. Siehe

Beispiel:

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

Als Alternative, wenn es keine andere Namensräume ist, einfach den Standard entfernen Namensraum mit

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

, bevor Sie das XML an Ihr SimpleXmlElement übergeben.

+4

+1 gute Erklärung und praktisches Beispiel. Leute, bitte nehmen Sie sich die Zeit, Namensräume zu verstehen. Sie sind nicht so schwer und auf lange Sicht ist es einfacher, sie zu verstehen, als ständig versuchen, ihnen auszuweichen. – LarsH