sb15 / xml-string-to-php-array
XML 到数组
v0.0.1
2014-08-10 09:20 UTC
Requires
- php: >=5.3
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
中存储根元素的标签名