gaarf/xml-to-php-array

此包最新版本(v1.0)没有可用的许可信息。

XML转PHP数组转换器

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

This package is auto-updated.

Last update: 2024-08-29 05:19:06 UTC


README

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

安装并简单使用

使用Composer

composer require gaarf/xml-to-php-array

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

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

文档

在PHP开发中,一个常见的需求是将XML文档转换为可序列化的数组。如果您曾经尝试过序列化()然后反序列化SimpleXML或DOMDocument对象,您就知道我在说什么了。

假设以下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的好记法,我们需要一个稍微详细一些的转换函数。这是我版本,在此以下授权,但请不要起诉我。

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

[roland-d#18] 将空节点视为字符串