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

时间:2014-09-05 08:26:14

标签: php xml json

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

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

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

提前致谢!

1 个答案:

答案 0 :(得分:4)

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

您执行的json / array转换不考虑这一点,只保留要显示的值。我担心没有诀窍可以做到这一点,但这是我在不知道如何巧妙地转换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"
      }
    }
  }
}