2010-10-26 38 views
9

Tôi gặp một chút rắc rối khi phân tích cú pháp XML từ phản hồi thanh toán của google. XML sắp đến từ máy chủ google nên không có vấn đề gì với chính XML.SimpleXmlElement và XPath, nhận mảng trống()

Tôi muốn giữ tất cả các thẻ thông báo đơn đặt hàng mới

Tôi đã thử điều này nhưng nhận được một mảng trống() trả về mọi lúc.

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

Một snipet XML (Chỉ cần đầu)

<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

* XML sắp xuất phát từ máy chủ google nên không có vấn đề gì với chính XML. * Có, google gần giống như @Jon Skeet trong lĩnh vực đó. XML của họ được định dạng đúng theo định nghĩa. ;-) – LarsH

Trả lời

14

Vấn đề là khả năng không gian tên mặc định. Xem

Ví dụ:

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

Là một thay thế nếu không có không gian tên khác, chỉ cần loại bỏ các mặc định không gian tên với

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

trước khi cấp XML cho SimpleXmlElement của bạn.

+4

+1 giải thích tốt và ví dụ thực tế. Các bạn, hãy dành thời gian để hiểu các không gian tên. Chúng không phải là khó khăn, và nó thực sự là dễ dàng hơn trong thời gian dài để hiểu chúng hơn là liên tục cố gắng để né tránh chúng. – LarsH