我有一些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。
$obj->xpath( '//items/item' );
我需要一个数组结果,所以我尝试了这个json_decode(json_encode($obj),true)技巧,但这看起来是要删除对@attributes的访问(即abc =“ 123”)。
json_decode(json_encode($obj),true)
还有另一种方法可以提供对属性的访问并使我留下一个数组吗?
您可以使用json_encode和一起走,json_decode并可以添加缺少的内容,因为json_encode-ing使用遵循某些特定规则SimpleXMLElement。
json_encode
json_decode
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 ) ) ) )