从SimpleXMLElement对象获取项目

时间:2010-01-02 04:02:19

标签: php xml arrays object

据我所知,SimpleXMLElement只是一个其他SimpleXMLElements的数组,如果没有嵌套在另一个标签中的标签,还有一些常规数组值。

我在变量$data中有一个SimpleXMLElement,var_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);

1 个答案:

答案 0 :(得分:6)

SimpleXMLElement 不是只是一个数组。要访问子元素,必须使用对象表示法($a->b)并访问必须使用数组表示法($a['b'])的属性。

问题是,使用对象表示法,有效的标记名称可能是非法的PHP代码。

你需要这样做:

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

请注意,这会返回一个SimpleXMLElement!原因是它可以包含文本,更多子元素或两者。 var_dump()的输出对于SimpleXMLElements来说是非常误导的。如果您想要单个<buyer-accepts-marketing>标记的文本内容,则必须执行以下操作:

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

当然,这样做也是完全合法的:

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

在某些情况下(例如echo使用SimpleXMLElement),这似乎有效的原因是类型转换是隐式和自动的。您不能echo一个对象,因此PHP会自动将其转换为字符串。

我与SimpleXML有爱/恨的关系。只有在您了解复杂实际API之后,它才会使 easy 非常容易。

阅读所谓的“basic”示例,以便更好地处理它。