2010-10-26 9 views
9

Tengo un problema con el análisis de XML de una respuesta de pago de Google. El XML proviene directamente del servidor de Google, por lo que no hay ningún problema con el XML en sí.SimpleXmlElement y XPath, obteniendo el conjunto vacío()

me quiere agarrar de todas las etiquetas de nuevo desde el pedido de notificación

he intentado esto, pero conseguir una matriz vacía() volvió cada vez.

$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 snipet XML (sólo el principio)

<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

* El XML proviene directamente del servidor de google, por lo que no hay ningún problema con el XML en sí. * Sí, Google es casi como @Jon Skeet en ese sentido. Su XML está bien formado por definición. ;-) – LarsH

Respuesta

14

La cuestión es probable que el espacio de nombres predeterminado. Ver

Ejemplo:

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

Como alternativa, si no hay otros espacios de nombres, basta con quitar el valor predeterminado espacio de nombres con

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

antes de alimentar el XML a su SimpleXmlElement.

+4

+1 buena explicación y ejemplo práctico. Amigos, tómense el tiempo para entender los espacios de nombres. No son tan difíciles, y a la larga es más fácil entenderlos que estar continuamente tratando de esquivarlos. – LarsH

Cuestiones relacionadas