【问题标题】:getting items from a SimpleXMLElement object从 SimpleXMLElement 对象中获取项目
【发布时间】:2010-12-31 17:24:49
【问题描述】:

据我所知,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);

等等

【问题讨论】:

    标签: php xml arrays object


    【解决方案1】:

    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'};
    

    这在某些情况下(例如echoing SimpleXMLElement)似乎有效的原因是类型转换是隐式和自动的。你不能echo一个对象,所以PHP会自动把它转换成一个字符串。

    我对 SimpleXML 爱恨交织。只有在您了解了实际 API 的复杂性之后,它才会让事情变得非常简单

    阅读所谓的“basic”示例以更好地掌握它。

    【讨论】:

      猜你喜欢
      • 2011-02-21
      • 2015-11-28
      • 1970-01-01
      • 2013-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多