2010-10-27 90 views
0

我試圖從GoogleCheckout響應中獲取一些數據。我正在使用SimpleXmlElement和xpath來搜索數據。其中一個問題是來自xpath的響應是一個SimpleXmlElements數組 - 我想要的只是字符串數據。另一個是響應可能包含TAG名稱的多個實例 - 例如,<email>顯示至少兩次,但我只想要一個單一的結果。在SimpleXmlElement上使用xPath獲取單個字符串結果

這裏是我迄今爲止

  $notifyData = array(); 
      $notifyData['buyerEmail'] = $data->xpath('buyer-billing-address//email')[0]; 
      $notifyData['buyerName'] = $data->xpath('buyer-billing-address//contact-name'); 
      $notifyData['transactionId'] = $data->xpath('/new-order-notification/google-order-number'); 
      $notifyData['itemName'] = $data->xpath('//item-name'); 
      $notifyData['amount'] = $data->xpath('//unit-price'); 
      $notifyData['currency'] = $notifyData['amount'][0]['currency'];//$data->xpath('//@currency[1]'); 

這裏是從的print_r()在$ notifyData響應

Array 
(
    [buyerEmail] => Array 
     (
      [0] => SimpleXMLElement Object 
       (
        [0] => [email protected] 
       ) 

     ) 

    [buyerName] => Array 
     (
      [0] => SimpleXMLElement Object 
       (
        [0] => Mr Sandbox Buyer 
       ) 

     ) 

    [transactionId] => Array 
     (
      [0] => SimpleXMLElement Object 
       (
        [0] => 271578474675716 
       ) 

     ) 

    [itemName] => Array 
     (
      [0] => SimpleXMLElement Object 
       (
        [0] => My Item 
       ) 

     ) 

    [amount] => Array 
     (
      [0] => SimpleXMLElement Object 
       (
        [@attributes] => Array 
         (
          [currency] => USD 
         ) 

        [0] => 3.99 
       ) 

     ) 

    [currency] => SimpleXMLElement Object 
     (
      [0] => USD 
     ) 

) 

我要的是數據顯示這樣的print_r後( )

Array 
(
    [buyerEmail] => [email protected] 
    ... 
    [currency] => USD 

下面是一個XML響應的示例

<new-order-notification xmlns="http://checkout.google.com/schema/2" serial-number="654578974677716-00001-7"> 

    <buyer-billing-address> 

    <address1>19 sandbox st</address1> 

    <address2></address2> 

    <phone></phone> 

    <email>[email protected]</email> 

    <company-name></company-name> 

    <contact-name>Mr Sandbox Buyer</contact-name> 

    <fax></fax> 

    <country-code>AU</country-code> 

    <city>Buyers Town</city> 

    <region>VIC</region> 

    <postal-code>3460</postal-code> 

    </buyer-billing-address> 

    <timestamp>2010-10-24T04:25:41.723Z</timestamp> 

    <google-order-number>298578974677716</google-order-number> 

    <shopping-cart> 

    <items> 

     <item> 

     <digital-content> 

      <key is-encrypted="true">PWWoqHo+FtfTi5vHmquOFTFNb4DwNjInAxkW89PLxtU=</key> 

      <description>Follow the instructions</description> 

      <url>http://mysite.com</url> 

     </digital-content> 

     <item-name>my product</item-name> 

     <item-description>my product</item-description> 

     <unit-price currency="USD">3.99</unit-price> 

     <quantity>1</quantity> 

     </item> 

    </items> 

    </shopping-cart> 

    <order-adjustment> 

    <merchant-codes /> 

    <total-tax currency="USD">0.0</total-tax> 

    <adjustment-total currency="USD">0.0</adjustment-total> 

    </order-adjustment> 

    <buyer-id>634168749882822</buyer-id> 

    <buyer-marketing-preferences> 

    <email-allowed>true</email-allowed> 

    </buyer-marketing-preferences> 

    <buyer-shipping-address> 

    <address1>19 sandbox st</address1> 

    <address2></address2> 

    <phone></phone> 

    <email>[email protected]</email> 

    <company-name></company-name> 

    <contact-name>Mr Sandbox Buyer</contact-name> 

    <fax></fax> 

    <country-code>AU</country-code> 

    <city>Buyers Town</city> 

    <region>VIC</region> 

    <postal-code>3460</postal-code> 

    </buyer-shipping-address> 

    <order-total currency="USD">3.99</order-total> 

    <fulfillment-order-state>NEW</fulfillment-order-state> 

    <financial-order-state>REVIEWING</financial-order-state> 

</new-order-notification> 

回答

1

這裏不一定需要xpath。例如。

$notifyData = array(
    'buyerEmail' => (string)$data->{'buyer-billing-address'}->email[0], 
    'buyerName' => (string)$data->{'buyer-billing-address'}->{'contact-name'}[0], 
    'transactionId' => (string)$data->{'google-order-number'}[0] 
); 
var_dump($notifyData); 


function getData() { 
    return <<< eox 
<new-order-notification xmlns="http://checkout.google.com/schema/2" serial-number="654578974677716-00001-7"> 
... 
</new-order-notification> 
eox; 
} 

打印

array(3) { 
    ["buyerEmail"]=> 
    string(18) "[email protected]" 
    ["buyerName"]=> 
    string(16) "Mr Sandbox Buyer" 
    ["transactionId"]=> 
    string(15) "298578974677716" 
} 

和經由foreach還可以處理多個元件,如例如<item>

1

使用類型轉換:

$ notifyData [ 'BUYERNAME'] = (字符串) $數據 - >的xpath( '買方的計費地址//接觸名');

相關問題