gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 12:56:45 25 4
gpt4 key购买 nike

我目前正在处理一个大量的 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/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"
}
}
}
}

关于php - 使用 JSON 将 XML 转换为 PHP 数组会删除某些元素的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25681582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com