我正在处理一个广泛的XML文件,使一些处理更容易我已经使用了下面的方法,如堆栈溢出中广泛提到的
$xml = simplexml_load_string($xml_string);
$json = json_encode($xml);
$array = json_decode($json,TRUE);
这很棒但是我的代码已经注意到某些实例,其中某些元素的属性没有正确转换,在这一步 $json = json_encode($xml);
这是一个精简的XML示例.
<?xml version="1.0"?>
<property>
    <landDetails>
        <area unit="squareMeter"/>
    </landDetails>
    <buildingDetails>
        <area unit="squareMeter">100</area>
    </buildingDetails>
</property>
这是输出.
Array (
    [landDetails] => Array (
        [area] => Array (
            [@attributes] => Array (
                [unit] => squareMeter
            )
        )
    )
    [buildingDetails] => Array (
        [area] => 100
    )
)
如上所示,如果元素包含该精确节点上的任何信息,则不处理与该元素相关联的属性.这导致转换之间的重大数据丢失.
有谁知道如何解决这个问题?
提前致谢!
元素已被处理,只是在节点具有属性和值的情况下不会显示它们。在这种情况下,仅显示值。
您所做的 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);
输出 :
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"
      }
    }
  }
}
| 归档时间: | 
 | 
| 查看次数: | 1275 次 | 
| 最近记录: |