2010-01-02 143 views
1

從我所知道的情況來看,SimpleXMLElement只是其他SimpleXMLElement的數組,另外還有一些常規數組值,如果沒有嵌套在另一個標記中的標記。從SimpleXMLElement對象獲取項目

我有一個SimpleXMLElement一個變量$datavar_dump($data)給了我這樣的:

object(SimpleXMLElement)#1 (33) { 
    ["buyer-accepts-marketing"]=> 
    string(4) "true" 
... 
... 

但調用var_dump($data->buyer-accepts-marketing)給我一個錯誤,並var_dump($data["buyer-accepts-marketing"])給我NULL。撥打var_dump($data->shipping-address->children())會給我一個錯誤。

會是這樣的:

foreach($data as $item) { 
    var_dump($item); 
} 

給出一大堆的SimpleXMLElement對象,但奇怪的是,沒有字符串或整數。

我在這裏錯過了什麼?我想利用它的特定部分,並將它們傳遞給函數,因此,例如,我沒有去

$data->billing-address->postal-code; 

... 

$data->shipping-address->postal-code; 

... 

,並可以去

address($data->billing-address); 
address($data->shipping-address); 

回答

6

SimpleXMLElement是而不是只是一個數組。要訪問子元素,必須使用對象表示法($a->b)並訪問必須使用數組表示法的屬性($a['b'])。

問題是,使用對象表示法,有效的標記名稱可能是非法的PHP代碼。

你需要這樣做:

$data->{'buyer-accepts-marketing'}; 

注意它返回一個SimpleXMLElement!這是因爲它可以包含文本,更多子元素或兩者。對於SimpleXMLElements,var_dump()的輸出非常具有誤導性。如果你想一個<buyer-accepts-marketing>標籤的文本內容,你必須這樣做:

(string)$data->{'buyer-accepts-marketing'}; 

當然它也是完全合法的做到這一點:

(int)$data->{'buyer-accepts-marketing'}; 

這似乎是工作的原因在某些情況下(如echo和SimpleXMLElement)是類型轉換是隱式的和自動的。你不能echo一個對象,所以PHP自動將它轉換爲一個字符串。

我與SimpleXML有愛/恨的關係。它使事情非常容易只有當你明白如何複雜實際的API是。

閱讀所謂的「basic」示例,以便很好地掌握它。

+0

是的!勝利!非常感謝! – 2010-01-02 04:11:34