从SimpleXMLElement对象获取项目

Car*_*ers 1 php xml arrays object

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

我在变量中有一个SimpleXMLElement $data,并var_dump($data)给我这个:

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

但是调用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);
}
Run Code Online (Sandbox Code Playgroud)

给出了一大堆SimpleXMLElement对象,但奇怪的是,没有字符串或整数.

我在这里错过了什么?我想采取它的特定部分并将它们传递给一个函数,所以例如,我不必去

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

...

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

...
Run Code Online (Sandbox Code Playgroud)

并且可以去

address($data->billing-address);
address($data->shipping-address);
Run Code Online (Sandbox Code Playgroud)

等等

Mik*_*ike 6

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

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

你需要这样做:

$data->{'buyer-accepts-marketing'};
Run Code Online (Sandbox Code Playgroud)

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

(string)$data->{'buyer-accepts-marketing'};
Run Code Online (Sandbox Code Playgroud)

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

(int)$data->{'buyer-accepts-marketing'};
Run Code Online (Sandbox Code Playgroud)

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

我与SimpleXML有一种爱/恨的关系.只有在您了解实际API的复杂程度后,才能使事情变得非常简单.

阅读所谓的" 基本 "示例,以便更好地处理它.