2014-09-05 50 views
7

我目前处理的广泛XML文件中删除的属性,以使一些处理更容易我用那样广泛的堆栈溢出提及以下方法转换XML到PHP阵列JSON上的一些元素

$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 
    ) 
) 

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

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

在此先感谢!

回答

4

处理元素,它们只是在节点具有属性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" 
     } 
    } 
    } 
} 
+0

只看这一点,上面的代码似乎没有传入前两个xml子元素的属性数组? 例如,如果您在'property'上添加'color =“red”'属性,然后在'landDetails'和'buildingDetails''和'color =“blue上添加'color =”green“'属性,则使用上述XML “区域”上的''属性。 只有蓝色属性才会导出到正在进行的阵列中。 – 2014-09-09 22:49:17

+1

@DevonMather对,我不知道为什么这个foreach循环是在has_children检查。事实上,这has_children检查是不需要的。我发现SimpleXML返回一个带空格和换行符的字符串。 'trim'足以检测它是否没有实际值。我在几种不同的XML结构上尝试了这个新代码,现在看起来好了。 :) – Sugar 2014-09-10 05:57:32

+0

此代码似乎不起作用。 ' <节点2 attr3 = “AAA” attr4 = “BBB”> <节点2 attr3 = “CCC” attr4 = “DDD”> XXX '这里'aaa'和'bbb'不出现在输出中。 – 2017-07-17 03:36:26