2010-01-02 141 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