我正在处理一个广泛的XML文件,使一些处理更容易我已经使用了下面的方法,如堆栈溢出中广泛提到的
$xml = simplexml_load_string($xml_string);
$json = json_encode($xml);
$array = json_decode($json,TRUE);
Run Code Online (Sandbox Code Playgroud)
这很棒但是我的代码已经注意到某些实例,其中某些元素的属性没有正确转换,在这一步 $json = json_encode($xml);
这是一个精简的XML示例.
<?xml version="1.0"?>
<property>
<landDetails>
<area unit="squareMeter"/>
</landDetails>
<buildingDetails>
<area unit="squareMeter">100</area>
</buildingDetails>
</property>
Run Code Online (Sandbox Code Playgroud)
这是输出.
Array (
[landDetails] => Array (
[area] => Array (
[@attributes] => Array (
[unit] => squareMeter
)
)
)
[buildingDetails] => Array (
[area] => 100
)
)
Run Code Online (Sandbox Code Playgroud)
如上所示,如果元素包含该精确节点上的任何信息,则不处理与该元素相关联的属性.这导致转换之间的重大数据丢失.
有谁知道如何解决这个问题?
提前致谢!
元素已被处理,只是在节点具有属性和值的情况下不会显示它们。在这种情况下,仅显示值。
您所做的 json / 数组转换没有考虑到这一点,并且只保留要显示的值。恐怕没有什么技巧可以做到这一点,但是当我不知道如何巧妙地转换 SimpleXML 元素时,我使用了一个函数(并且它分别处理属性和值)
function simplexml_to_array ($xml, &$array) {
// Empty node : <node></node>
$array[$xml->getName()] = '';
// Nodes with children
foreach ($xml->children() as $child) {
simplexml_to_array($child, $array[$xml->getName()]);
}
// Node attributes
foreach ($xml->attributes() as $key => $att) {
$array[$xml->getName()]['@attributes'][$key] = (string) $att;
}
// Node with value
if (trim((string) $xml) != '') {
$array[$xml->getName()][] = (string) $xml;
}
}
$xml = simplexml_load_string($xml);
simplexml_to_array($xml, $arr);
var_dump($arr);
Run Code Online (Sandbox Code Playgroud)
输出 :
array(1) {
["property"]=>
array(2) {
["landDetails"]=>
array(1) {
["area"]=>
array(1) {
["@attributes"]=>
array(1) {
["unit"]=>
string(11) "squareMeter"
}
}
}
["buildingDetails"]=>
array(1) {
["area"]=>
array(2) {
["@attributes"]=>
array(1) {
["unit"]=>
string(11) "squareMeter"
}
[0]=>
string(3) "100"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)