据我所知,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);
等
答案 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”示例,以便更好地处理它。