使用JSON将XML转换为PHP数组是删除某些元素的属性

Dev*_*her 7 php xml json

我正在处理一个广泛的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)

如上所示,如果元素包含该精确节点上的任何信息,则不处理与该元素相关联的属性.这导致转换之间的重大数据丢失.

有谁知道如何解决这个问题?

提前致谢!

Clé*_*let 4

元素已被处理,只是在节点具有属性和值的情况下不会显示它们。在这种情况下,仅显示值。

您所做的 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)