本文介绍了什么是最好的 php DOM 2 Array 函数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想解析xml文件,到目前为止,我发现的最好方法是使用 DOMDocument() 类.
I want to parse xml files,The best way I found is to use DOMDocument() class so far.
示例 xml 字符串:
sample xml string:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<response>
<resData>
<contact:infData xmlns:contact="http://example.com/contact-1.0">
<contact:status s="value1"/>
<contact:status s="value2"/>
<contact:status s="value3"/>
<contact:status s="value4"/>
</contact:infData>
</resData>
</response>
我使用函数 dom2array(波纹管)来解析 dom,但它只返回 1 个元素(仅 value4)
I use function dom2array (bellow) to parse dom, but it only return 1 element (value4 only)
<?php
function dom2array($node) {
$res = array();
if($node->nodeType == XML_TEXT_NODE){
$res = $node->nodeValue;
}else{
if($node->hasAttributes()){
$attributes = $node->attributes;
if(!is_null($attributes)){
$res['@attributes'] = array();
foreach ($attributes as $index=>$attr) {
$res['@attributes'][$attr->name] = $attr->value;
}
}
}
if($node->hasChildNodes()){
$children = $node->childNodes;
for($i=0;$i<$children->length;$i++){
$child = $children->item($i);
$res[$child->nodeName] = dom2array($child);
}
}
}
return $res;
}
?>
有没有办法解析所有的xml元素并将它们发送到一个数组中?
Is there any way to parse all xml elements and sent them to an array?
输出数组:
Array
(
[response] => Array
(
[#text] =>
[resData] => Array
(
[#text] =>
[contact:infData] => Array
(
[#text] =>
[contact:status] => Array
(
[@attributes] => Array
(
[s] => value4
)
)
)
)
)
)
value1、value2、value3 在哪里?:(谢谢
Where is value1, value2, value3 ? :(Thank you
推荐答案
你可以使用这个(基于:http://php.net/manual/en/book.dom.php#93717);
You can use this (based on: http://php.net/manual/en/book.dom.php#93717);
function xml_to_array($root) {
$result = array();
if ($root->hasAttributes()) {
$attrs = $root->attributes;
foreach ($attrs as $attr) {
$result['@attributes'][$attr->name] = $attr->value;
}
}
if ($root->hasChildNodes()) {
$children = $root->childNodes;
if ($children->length == 1) {
$child = $children->item(0);
if ($child->nodeType == XML_TEXT_NODE) {
$result['_value'] = $child->nodeValue;
return count($result) == 1
? $result['_value']
: $result;
}
}
$groups = array();
foreach ($children as $child) {
if (!isset($result[$child->nodeName])) {
$result[$child->nodeName] = xml_to_array($child);
} else {
if (!isset($groups[$child->nodeName])) {
$result[$child->nodeName] = array($result[$child->nodeName]);
$groups[$child->nodeName] = 1;
}
$result[$child->nodeName][] = xml_to_array($child);
}
}
}
return $result;
}
测试;
$s = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<response>
<resData foo="1">
<contact:infData xmlns:contact="http://example.com/contact-1.0" bar="1">
<contact:status s="value1"/>
<contact:status s="value2"/>
<contact:status s="value3"/>
<contact:status s="value4"/>
</contact:infData>
</resData>
</response>';
$xml = new DOMDocument();
$xml->loadXML($s);
$xmlArray = xml_to_array($xml);
print_r($xmlArray);
// print_r($xmlArray['response']['resData']['contact:infData']['contact:status'][0]['@attributes']['s']);
// foreach ($xmlArray['response']['resData']['contact:infData']['contact:status'] as $status) {
// echo $status['@attributes']['s'] ."\n";
// }
这篇关于什么是最好的 php DOM 2 Array 函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!