如何将xml文档转换为json而不丢失单个标记元素?
My XML:
<myTag><singleTag internValue="bli bla blo"/></myTag>
my PHP:
$xml = simplexml_load_string($result);
$json = json_decode(json_encode($xml));
my output/result:
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一切都很好。
因此,再次感谢您的帮助,并为这样一个小错误感到抱歉:/
试试这个
$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";
}
}
这实际上应该是一个注释,但是对于注释来说太长了:
我执行问题中给出的代码
$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 ?