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

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

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

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

提前致谢!


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

你所做的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"
      }
    }
  }
}
链接地址: http://www.djcxy.com/p/81203.html

上一篇: Converting XML into PHP array with JSON is deleting attributes on some elements

下一篇: How do you perform blocking IO in apache spark job?