sb15/xml-string-to-php-array

XML 到数组

v0.0.1 2014-08-10 09:20 UTC

This package is auto-updated.

Last update: 2024-09-12 03:17:47 UTC


README

在PHP工作中,将XML文档转换为可序列化数组是一个常见需求。如果你尝试过使用serialize()和unserialize()来序列化和反序列化SimpleXML或DOMDocument对象,你就知道我在说什么了。

假设以下XML片段

<tv>
  <show name="Family Guy">
    <dog>Brian</dog>
    <kid>Chris</kid>
    <kid>Meg</kid>
  </show>
</tv>

有一种快速且简单的方法可以将此类文档转换为数组,使用类型转换和JSON函数以确保没有会导致反序列化时出现问题的奇异值。

<?php
  $a = json_decode(json_encode((array) simplexml_load_string($s)),1);
?>

以下是我们的示例XML的结果,例如,如果我们使用print_r($a)

Array
(
    [show] => Array
        (
            [@attributes] => Array
                (
                    [name] => Family Guy
                )
            [dog] => Brian
            [kid] => Array
                (
                    [0] => Chris
                    [1] => Meg
                )
        )
)

相当酷,对吧?但是也许我们想嵌入一些HTML标签或类似的东西。那么我们需要一个CDATA节点...

<tv>
  <show name="Family Guy">
    <dog>Brian</dog>
    <kid>Chris</kid>
    <kid>Meg</kid>
    <kid><![CDATA[<em>Stewie</em>]]></kid>
  </show>
</tv>

上面的XML片段将产生以下结果

Array
(
    [show] => Array
        (
            [@attributes] => Array
                (
                    [name] => Family Guy
                )
            [dog] => Brian
            [kid] => Array
                (
                    [0] => Chris
                    [1] => Meg
                    [2] => Array
                        (
                        )
                )
        )
)

这并不太有用。我们遇到了麻烦,因为CDATA节点,一个SimpleXMLElement,被转换为一个数组而不是一个字符串。为了处理这种情况,同时保持@attributes的漂亮表示法,我们需要一个稍微冗长的转换函数。这是我版本,以下是在不追究责任的情况下使用的许可。

对于我们的Stewie片段的结果

Array
(
    [show] => Array
        (
            [@attributes] => Array
                (
                    [name] => Family Guy
                )
            [dog] => Brian
            [kid] => Array
                (
                    [0] => Chris
                    [1] => Meg
                    [2] => <em>Stewie</em>
                )
        )
)

胜利是我的! :D

贡献

[clh-code#1] 如果一个节点有属性但只包含文本,那么输出将是一个包含@content@attributes键的数组

[reggi#4] 在@root中存储根元素的标签名