一尘不染

Json编码或序列化XML

json

我有一些xml,这是它的简单版本。

<xml>
<items>
  <item abc="123">item one</item>
  <item abc="456">item two</item>
</items>
</xml>

在内容上使用SimpleXML,

 $obj = simplexml_load_string( $xml );

我可以使用$obj->xpath( '//items/item' );并访问@attributes。

我需要一个数组结果,所以我尝试了这个json_decode(json_encode($obj),true)技巧,但这看起来是要删除对@attributes的访问(即abc
=“ 123”)。

还有另一种方法可以提供对属性的访问并使我留下一个数组吗?


阅读 247

收藏
2020-07-27

共1个答案

一尘不染

您可以使用json_encode和一起走,json_decode并可以添加缺少的内容,因为json_encode-ing使用遵循某些特定规则SimpleXMLElement

如果您对规则及其详细信息感兴趣,我已经写了两篇关于它的博客文章:

对于您来说,也许更有趣的是第三部分,它显示了如何修改json序列化并提供您自己的格式(例如,保留属性):

它附带了完整的示例,下面是代码摘录:

$xml = '<xml>
<items>
  <item abc="123">item one</item>
  <item abc="456">item two</item>
</items>
</xml>';

$obj = simplexml_load_string($xml, 'JsonXMLElement');

echo $json = json_encode($obj, JSON_PRETTY_PRINT), "\n";

print_r(json_decode($json, TRUE));

JSON和数组的输出如下,请注意,属性是其中的一部分:

{
    "items": {
        "item": [
            {
                "@attributes": {
                    "abc": "123"
                },
                "@text": "item one"
            },
            {
                "@attributes": {
                    "abc": "456"
                },
                "@text": "item two"
            }
        ]
    }
}
Array
(
    [items] => Array
        (
            [item] => Array
                (
                    [0] => Array
                        (
                            [@attributes] => Array
                                (
                                    [abc] => 123
                                )

                            [@text] => item one
                        )

                    [1] => Array
                        (
                            [@attributes] => Array
                                (
                                    [abc] => 456
                                )

                            [@text] => item two
                        )

                )

        )

)
2020-07-27