2010-12-02 105 views
1

我有一個XML文件給我地址。下面是摘錄:處理此XML Feed的最佳方式是什麼?

<ezi:orderaddresses> 
     <ezi:orderaddress> 
      <ezi:addresstype>billing</ezi:addresstype> 
      <ezi:name>Jason Fonseca</ezi:name> 
      <ezi:companyname>Cyber</ezi:companyname> 
      <ezi:address1>8 springstein</ezi:address1> 
      <ezi:division>NT</ezi:division> 
      <ezi:postalcode>34245</ezi:postalcode> 
      <ezi:countrycode>AU</ezi:countrycode> 
      <ezi:email>[email protected]</ezi:email> 
      <ezi:phone>89549854</ezi:phone> 
      <ezi:mobilephone>984590598</ezi:mobilephone> 
     </ezi:orderaddress> 
     <ezi:orderaddress> 
      <ezi:addresstype>shipping</ezi:addresstype> 
      <ezi:name>Jason Fonseca</ezi:name> 
      <ezi:companyname>Cyber</ezi:companyname> 
      <ezi:address1>8 springstein</ezi:address1> 
      <ezi:division>NT</ezi:division> 
      <ezi:postalcode>34245</ezi:postalcode> 
      <ezi:countrycode>AU</ezi:countrycode> 
      <ezi:email>[email protected]</ezi:email> 
      <ezi:phone>89549854</ezi:phone> 
     </ezi:orderaddress> 
     </ezi:orderaddresses> 

除了上面的兩個格式「orderaddress」標籤,也可以是一個,例如:

 <ezi:orderaddresses> 
     <ezi:orderaddress> 
      <ezi:addresstype>billing</ezi:addresstype> 
      <ezi:name>Jason Fonseca</ezi:name> 
      <ezi:companyname>Cyber</ezi:companyname> 
      <ezi:address1>8 springstein</ezi:address1> 
      <ezi:division>NT</ezi:division> 
      <ezi:postalcode>34245</ezi:postalcode> 
      <ezi:countrycode>AU</ezi:countrycode> 
      <ezi:email>[email protected]</ezi:email> 
      <ezi:phone>89549854</ezi:phone> 
      <ezi:mobilephone>984590598</ezi:mobilephone> 
     </ezi:orderaddress> 
     </ezi:orderaddresses> 

我找到的是利用簡單的XML時,要解釋這,在一審中,我得到如下:

[orderaddresses] => SimpleXMLElement Object 
    (
     [orderaddress] => Array 
      (
       [0] => SimpleXMLElement Object 
        (
         [addresstype] => billing 
         [name] => Jason Fonseca 
         [companyname] => Cyber 
         [address1] => 8 springstein 
         [division] => NT 
         [postalcode] => 34245 
         [countrycode] => AU 
         [email] => [email protected] 
         [phone] => 89549854 
         [mobilephone] => 984590598 
        ) 

       [1] => SimpleXMLElement Object 
        (
         [addresstype] => shipping 
         [name] => Jason Fonseca 
         [companyname] => Cyber 
         [address1] => 8 springstein 
         [division] => NT 
         [postalcode] => 34245 
         [countrycode] => AU 
         [email] => [email protected] 
         [phone] => 89549854 
        ) 

      ) 

    ) 

而在第二種情況下,我得到這個:

[orderaddresses] => SimpleXMLElement Object 
     (
      [orderaddress] => SimpleXMLElement Object 
       (
        [addresstype] => billing 
        [name] => Jason Fonseca 
        [companyname] => Cyber 
        [address1] => 8 springstein 
        [division] => NT 
        [postalcode] => 34245 
        [countrycode] => AU 
        [email] => [email protected] 
        [phone] => 89549854 
        [mobilephone] => 984590598 
       ) 

     ) 

Keen觀察者會注意到,現在如果我嘗試訪問 orderaddresses-> orderaddress,這將根據是否有兩個地址(或更多)或只有一個地址而具有不同的結構。 示例2它是一個數字索引數組,示例二它是一個關聯對象。

爲了規範這一點,我已經使用了一些代碼,看起來像這樣:

if(!isset($content['orderlines']['orderline'][0])) 
    { 
     $temp = $content['orderlines']['orderline']; 
     unset($content['orderlines']['orderline']); 
     $content['orderlines']['orderline'][0] =$temp; 
    } 

(你可以忽略我使用關聯數組這裏的事實,我有一個例程執行轉換,但我已經檢查,這個例程不會改變結果)。

我的問題是,我應該如何正確地插入這些數據?每次嘗試訪問orderaddress和命令行時都會有這樣的代碼片斷,實在太亂了。沒有更好的方法嗎?

編輯我的轉換例程來處理這個想法已經超越了我的想法。如果你認爲這是一條路,那麼讓我知道,但我認爲自己肯定會遇到這個問題,而且有人必須有一個明智而簡單的解決方案呢?

感謝

回答

1

按照documentation for simplexml你應該總是能夠遍歷等屬性即使只是其中之一,這可能是實現你想要什麼的「最好」的方式。例如:

for($xml->thingThereMayBeOneOrMoreOf as $item) { 
    //handle $item 
} 

或者,如果你只需要處理的第一個項目

$item=$xml->thingThereMayBeOneOrMoreOf[0]; 
//handle $item 

此外,根據文檔,這些特性實際上不是數組,但訪問的(標化)和迭代的特性,只是var_dump等會將它們轉換爲/將它們當作數組用於轉儲。

我還沒有真正測試過這個,ymmv。

+0

酷感謝,我會試試看,但看起來像去 – Jason 2010-12-02 04:59:07

相關問題