PHP XML到json而不会丢失单个标记元素

时间:2015-09-23 07:53:26

标签: php json xml

如何在不丢失单个标记元素的情况下将xml文档转换为json?

我的XML:

<myTag><singleTag internValue="bli bla blo"/></myTag>  

我的PHP:

$xml = simplexml_load_string($result);  
$json = json_decode(json_encode($xml));

我的输出/结果:

myTag = Object
(
   0 = Object
   (
      @attributes = Object
      (
         internValue = String(11) "bli bla blo"
      )
   )
)

但我错过了有关名称“singleTag”的信息。它没有出现在我的结果中,但为什么?显示所有“myTag”名称后。

我尝试了不同的解决方案,但问题出在json_encode中。这里的信息已经丢失了:

"myTag":{"0":{"@attributes":{"internValue":"bli bla blo"}}}

感谢您的帮助 问候,
christopher2007

编辑:

以下是此问题的更好示例:

$result = '<surround>
    <mainCat>
        <firstTag val1="false" val2="true" val3="false" val4="false" />
        <secondTag val1="false" val2="true" val3="false" val4="false" />
        <myTag><singleTag internValue="bli bla blo"/></myTag>
    </mainCat>
</surround>';
$xml = simplexml_load_string($result);
$json = json_decode(json_encode($xml));  

解决方案:

问题出在PHP版本中。一开始我有 Apache / 2.4.10(Win32)OpenSSL / 1.0.1i PHP / 5.6.3 并降级到 PHP版本5.6.13 一切正常。
再次感谢您的所有帮助,并抱歉这样一个小错误:/

2 个答案:

答案 0 :(得分:3)

试试这个

$xml = simplexml_load_string($xml_string);
$json = json_encode($xml);
$array = json_decode($json,TRUE);

编辑:

要迭代多维数组,可以使用RecursiveArrayIterator

$jsonIterator = new RecursiveIteratorIterator(
    new RecursiveArrayIterator(json_decode($json, TRUE)),
    RecursiveIteratorIterator::SELF_FIRST);

foreach ($jsonIterator as $key => $val) {
    if(is_array($val)) {
        echo "$key:\n";
    } else {
        echo "$key => $val\n";
    }
}

答案 1 :(得分:1)

这实际上应该是评论,但是评论太长了:

我执行问题中给出的代码

$result = '<surround>
    <mainCat>
        <firstTag val1="false" val2="true" val3="false" val4="false" />
        <secondTag val1="false" val2="true" val3="false" val4="false" />
        <myTag><singleTag internValue="bli bla blo"/></myTag>
    </mainCat>
</surround>';
$xml = simplexml_load_string($result);
$json = json_decode(json_encode($xml));

echo json_encode($xml);
echo "<br/>print_r: <br/>";
print_r($json);

http://phptester.net并获得以下结果

{"mainCat":{"firstTag":{"@attributes":{"val1":"false","val2":"true","val3":"false","val4":"false"}},"secondTag":{"@attributes":{"val1":"false","val2":"true","val3":"false","val4":"false"}},"myTag":{"singleTag":{"@attributes":{"internValue":"bli bla blo"}}}}}
print_r: 
stdClass Object ( [mainCat] => stdClass Object ( [firstTag] => stdClass Object ( [@attributes] => stdClass Object ( [val1] => false [val2] => true [val3] => false [val4] => false ) ) [secondTag] => stdClass Object ( [@attributes] => stdClass Object ( [val1] => false [val2] => true [val3] => false [val4] => false ) ) [myTag] => stdClass Object ( [singleTag] => stdClass Object ( [@attributes] => stdClass Object ( [internValue] => bli bla blo ) ) ) ) )

据我所知,没有信息丢失,你的singleTag就在那里。

那么也许这是一个PHP版本的问题?您使用的是哪个版本的PHP?