macropage/xml-to-php-array

该软件包最新版本(v1.0)没有可用的许可证信息。

XML到PHP数组转换器

v1.0 2019-10-08 18:51 UTC

This package is auto-updated.

Last update: 2024-09-08 07:39:06 UTC


README

仅作为一个分支:gaarf/XML-string-to-PHP-array - 但可通过 https://packagist.org.cn/ 访问

XML到PHP数组转换器

智能工具,将XML转换为PHP数组。

安装并简单使用

使用Composer

composer require macropage/xml-to-php-array

然后软件包将自动安装到您的项目中,您可以直接调用

$resultArray = Convertor::covertToArray($xml);

文档

在PHP工作中,一个常见的需求是将XML文档转换为可序列化数组的方法。如果您曾经尝试过对SimpleXML或DOMDocument对象进行serialize()和unserialize()操作,您就了解我在说什么。

假设以下XML片段

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

有一个快速且简单的方法可以将此类文档转换为数组,使用类型转换和JSON函数以确保没有在反序列化时引起问题的异类值

$a = json_decode(json_encode((array) Convertor::covertToArray($s)), true);

以下是我们的示例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表示法,我们需要一个稍微冗长的转换函数。这是我的版本,现在以do-whatever-but-dont-sue-me许可证发布。

对于我们的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

[janbarasek#13] 添加对PHP 7.1+的支持。更好的代码风格。

[janbarasek#15] 将存储库重写为Composer软件包。