据我所知,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对象,但奇怪的是,没有字符串或int。
这里我漏掉了什么?我想获取它的特定部分,并将它们传递给一个函数,因此,例如,我不必
$data->billing-address->postal-code;
...
$data->shipping-address->postal-code;
...然后就可以走了
address($data->billing-address);
address($data->shipping-address);等。
发布于 2010-01-02 12:09:00
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'};在某些情况下(例如在SimpleXMLElement中使用echo),这似乎是可行的,原因是类型转换是隐式的和自动的。你不能echo一个对象,所以PHP会自动将它转换成一个字符串。
我和SimpleXML有一种又爱又恨的关系。只有在你理解了实际的API有多复杂之后,它才会让事情变得非常简单。
阅读所谓的"basic“示例,以便更好地掌握它。
https://stackoverflow.com/questions/1990565
复制相似问题