当简单 XML 不准确时 XML 到 PHP 数组
XML to PHP array when simpleXML isn't acurate
好的,所以我有一个问题,我从 API 中提取数据库并返回如下结构:
<Response id="responceidgoeshere">
<block name="addresses">
<block>
<a name="building" format="text">#NAME/NUM#</a>
<a name="sub-premise" format="text">#SUB-PREM#</a>
<a name="street" format="text">#STREET#</a>
<a name="locality" format="text">#LOCAL#</a>
<a name="city" format="text">#CITY#</a>
<a name="postcode" format="text">#POSTCODE#</a>
<a name="ref" format="text">#REF#</a>
<a name="csscode" format="text">#CSS#</a>
</block>
<block>
<a name="building" format="text">#NAME/NUM#</a>
<a name="street" format="text">#STREET#</a>
<a name="locality" format="text">#LOCAL#</a>
<a name="city" format="text">#CITY#</a>
<a name="postcode" format="text">#POSTCODE#</a>
<a name="ref" format="text"/>
<a name="csscode" format="text"/>
</block>
</block>
</Response>
但是,您可以看到结果之间的数据会根据地址略有变化。
当我使用 simpleXML 转换为 PHP 数组时,我得到以下结果:
编辑:包括转换方法:
$xml=simplexml_load_string($result, "SimpleXMLElement", LIBXML_NOCDATA);
$json=json_encode($xml);
$array=json_decode($json,TRUE);
结果:
[0] => Array
(
[a] => Array
(
[0] => #NAME/NUM#
[1] => #SUB-PREM#
[2] => #STREET#
[3] => #LOCAL#
[4] => #CITY#
[5] => #POSTCODE#
[6] => #REF#
[7] => #CSS#
)
[1] => Array
(
[a] => Array
(
[0] => #NAME/NUM#
[1] => #STREET#
[2] => #LOCAL#
[3] => #CITY#
[4] => #POSTCODE#
[5] => #REF#
[6] => #CSS#
)
理想情况下,我需要一种方法来创建一个以 "name" 属性作为键的 PHP 数组。有谁知道执行此操作的最佳方法,因为标准的 simpleXML 对我的需要来说太不一致了,因为不会总是有 sub premice 元素,有时也会有 county 元素。
编辑:所需结构示例:
[0]=array
(
[a]=array
(
['building'] => #NAME/NUM#,
['sub-premise'] => #SUB-PREM#,
['street'] => #STREET#,
etc...
)
)
使用 json_decode/encode
或使用 (array)
将 SimpleXMLElement
对象转换为数组几乎总是会丢失数据(尤其是 XML 属性)。你会发现尝试使用它们的本机 API 访问它们比尝试盲目地将它们转换成其他东西要容易得多。
通过遍历元素并构建一个由 name
属性索引的数组,可以很容易地完成您需要做的事情:
$result = [];
foreach ($sxml->block->block as $block) {
$row = [];
foreach ($block->a as $a) {
$row[(string) $a['name']] = (string) $a;
}
$result[] = $row;
}
好的,所以我有一个问题,我从 API 中提取数据库并返回如下结构:
<Response id="responceidgoeshere">
<block name="addresses">
<block>
<a name="building" format="text">#NAME/NUM#</a>
<a name="sub-premise" format="text">#SUB-PREM#</a>
<a name="street" format="text">#STREET#</a>
<a name="locality" format="text">#LOCAL#</a>
<a name="city" format="text">#CITY#</a>
<a name="postcode" format="text">#POSTCODE#</a>
<a name="ref" format="text">#REF#</a>
<a name="csscode" format="text">#CSS#</a>
</block>
<block>
<a name="building" format="text">#NAME/NUM#</a>
<a name="street" format="text">#STREET#</a>
<a name="locality" format="text">#LOCAL#</a>
<a name="city" format="text">#CITY#</a>
<a name="postcode" format="text">#POSTCODE#</a>
<a name="ref" format="text"/>
<a name="csscode" format="text"/>
</block>
</block>
</Response>
但是,您可以看到结果之间的数据会根据地址略有变化。 当我使用 simpleXML 转换为 PHP 数组时,我得到以下结果:
编辑:包括转换方法:
$xml=simplexml_load_string($result, "SimpleXMLElement", LIBXML_NOCDATA);
$json=json_encode($xml);
$array=json_decode($json,TRUE);
结果:
[0] => Array
(
[a] => Array
(
[0] => #NAME/NUM#
[1] => #SUB-PREM#
[2] => #STREET#
[3] => #LOCAL#
[4] => #CITY#
[5] => #POSTCODE#
[6] => #REF#
[7] => #CSS#
)
[1] => Array
(
[a] => Array
(
[0] => #NAME/NUM#
[1] => #STREET#
[2] => #LOCAL#
[3] => #CITY#
[4] => #POSTCODE#
[5] => #REF#
[6] => #CSS#
)
理想情况下,我需要一种方法来创建一个以 "name" 属性作为键的 PHP 数组。有谁知道执行此操作的最佳方法,因为标准的 simpleXML 对我的需要来说太不一致了,因为不会总是有 sub premice 元素,有时也会有 county 元素。
编辑:所需结构示例:
[0]=array
(
[a]=array
(
['building'] => #NAME/NUM#,
['sub-premise'] => #SUB-PREM#,
['street'] => #STREET#,
etc...
)
)
使用 json_decode/encode
或使用 (array)
将 SimpleXMLElement
对象转换为数组几乎总是会丢失数据(尤其是 XML 属性)。你会发现尝试使用它们的本机 API 访问它们比尝试盲目地将它们转换成其他东西要容易得多。
通过遍历元素并构建一个由 name
属性索引的数组,可以很容易地完成您需要做的事情:
$result = [];
foreach ($sxml->block->block as $block) {
$row = [];
foreach ($block->a as $a) {
$row[(string) $a['name']] = (string) $a;
}
$result[] = $row;
}