【问题标题】:Converting multidimensional SimpleXML to associative array将多维 SimpleXML 转换为关联数组
【发布时间】:2018-07-19 12:43:50
【问题描述】:

我有一个嵌套的多维 XML 字符串,我输入了 SimpleXML。我想将其转换为关联数组。 php.net 上列出的示例无法正常工作,或者它们仅适用于平面 xml。

【问题讨论】:

  • 请添加示例输入和所需的输出。那么你的 SimpleXML 代码是什么?
  • 为什么需要这个数组?按原样处理 XML 内容可能更容易。
  • 这样做的例子有几十个,甚至上百个。你甚至没有说你已经找到的那些“不能正常工作”,所以很难看出这里的新例子会有什么更好。

标签: php xml simplexml


【解决方案1】:

这比 SimpleXML 手册页上的示例效果更好,但在当前形式下它会丢弃属性。

function xml2array($xmlObject, $out = array())
{
    foreach ($xmlObject as $node) {
        if ($node->count() > 0) {
            $out[$node->getName()][] = xml2array($node);
        } else {
            $out[$node->getName()] = (string)$node;
        }
    }
    return $out;
}

【讨论】:

  • 然后添加遍历参数:foreach ($node->attributes() as $key => $val) { $out[$node->getName()][$key] = $val; }
  • @raina77ow ...此时您很快就会发现为什么将 XML 扁平化为数组是一种痛苦,因为属性可能与子元素具有相同的名称。这就是 SimpleXML 存在的原因,所以您不需要。
  • 我真的不认为这实际上是一个问题,因为您可以延迟填充属性并排除(或以其他方式处理)重复项。问题是,作者不应该阻止这种情况吗? XML 模式,在那些日子里它们还没有用吗? )
  • @raina77ow 他们为什么要这样做?在 XML 中写 <person id="42"><id type="passport">...</id></person> 是完全有效的。这只是您在编写这样的通用转换时遇到的许多问题之一。同样,SimpleXML 被明确设计为让您可以访问所有数据而不会出现任何这些问题,那么为什么不直接使用它呢?
  • @IMSoP 如果不重写部署在生产中的整个库,就无法使用它。必须在范围内工作,这就是现实世界。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
  • 1970-01-01
  • 2021-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多