需要解析的xml文件area.xml如下
<?xml version="1.0" encoding="utf-8"?>
<info>
<humans type="1" id="1">
<zhangying>
<name>张映</name>
<name>张映2</name>
<sex>男</sex>
<old>28</old>
</zhangying>
<tank>
<name>tank</name>
<sex>男</sex>
<old>28</old>
</tank>
</humans>
<areas>
<beijing>
<name>北京</name>
<oid>1</oid>
</beijing>
<nanjing>
<name>南京</name>
<oid>2</oid>
</nanjing>
</areas>
</info>
function getArray($elements) {
$arr=array();
if($elements->hasChildNodes()) {
foreach($elements->childNodes as $node) {
echo $node->nodeName."\n";
}
}
}
$xmlfile="area.xml";
$dom = new DOMDocument();
$dom->load($xmlfile);
$elements = $dom->documentElement;
print_r(getArray($elements));
#text
humans
#text
areas
#text
分析:
#text 类型是XML_TEXT_NODE,所以需要屏蔽,只有在最内层的结点之间需要
程序2:
function getArray($elements) {
$arr=array();
if($elements->hasChildNodes() && $elements->childNodes->length!=1) { //$elements->childNodes->length!=1 过滤 #text
foreach($elements->childNodes as $node) {
if($node->nodeType != XML_TEXT_NODE) {
$arr[$node->nodeName]=getArray($node);
}
}
}
else {
return iconv("UTF-8","GB2312",$elements->nodeValue);
}
return $arr;
}
$xmlfile="test.xml";
$dom = new DOMDocument();
$dom->load($xmlfile);
$elements = $dom->documentElement;
//print_r(getArray($elements));
$arr=getArray($elements);
print_r($arr);
echo $arr[humans][zhangying][name]; //张映2
Array
(
[humans] => Array
(
[zhangying] => Array
(
[name] => 张映2
[sex] => 男
[old] => 28
)
[tank] => Array
(
[name] => tank
[sex] => 男
[old] => 28
)
)
[areas] => Array
(
[beijing] => Array
(
[name] => 北京
[oid] => 1
)
[nanjing] => Array
(
[name] => 南京
[oid] => 2
)
)
)
张映2
分析:
在一层中如果出现两个相同的标签,就会覆盖第一个第一标签:
<name>张映</name>
<name>张映2</name>
程序3:
function getArray($elements) {
$arr=array();
if($elements->hasChildNodes() && $elements->childNodes->length!=1) { //$elements->childNodes->length!=1 过滤 #text
foreach($elements->childNodes as $node) {
if($node->nodeType != XML_TEXT_NODE) {
$arr[$node->nodeName][]=getArray($node); #相对程序2的唯一修改的地方
}
}
}
else {
return iconv("UTF-8","GB2312",$elements->nodeValue);
}
return $arr;
}
$xmlfile="area.xml";
$dom = new DOMDocument();
$dom->load($xmlfile);
$elements = $dom->documentElement;
//print_r(getArray($elements));
$arr=getArray($elements);
print_r($arr);
echo $arr[humans][0][zhangying][0][name][0]; //张映
echo $arr[humans][0][zhangying][0][name][1]; //张映2
输出结果如下:
Array
(
[humans] => Array
(
[0] => Array
(
[zhangying] => Array
(
[0] => Array
(
[name] => Array
(
[0] => 张映
[1] => 张映2
)
[sex] => Array
(
[0] => 男
)
[old] => Array
(
[0] => 28
)
)
)
[tank] => Array
(
[0] => Array
(
[name] => Array
(
[0] => tank
)
[sex] => Array
(
[0] => 男
)
[old] => Array
(
[0] => 28
)
)
)
)
)
[areas] => Array
(
[0] => Array
(
[beijing] => Array
(
[0] => Array
(
[name] => Array
(
[0] => 北京
)
[oid] => Array
(
[0] => 1
)
)
)
[nanjing] => Array
(
[0] => Array
(
[name] => Array
(
[0] => 南京
)
[oid] => Array
(
[0] => 2
)
)
)
)
)
)
张映张映2
分析:
发现
<humans type="1" id="1">
的属性没有读取到
程序4:
将结点的属性放到第一个[0]位置
function getArray($elements) {
$arr=array();
if($elements->hasAttributes()) { //将属性值放到第一[0]个
foreach ($elements->attributes as $attr) {
$arr[$attr->nodeName] = iconv("UTF-8","GB2312",$attr->nodeValue);
}
}
if($elements->hasChildNodes() && $elements->childNodes->length!=1) { //$elements->childNodes->length!=1 过滤 #text
foreach($elements->childNodes as $node) {
if($node->nodeType != XML_TEXT_NODE) {
$arr[$node->nodeName][]=getArray($node);
}
}
}
else {
return iconv("UTF-8","GB2312",$elements->nodeValue);
}
return $arr;
}
$xmlfile="area.xml";
$dom = new DOMDocument();
$dom->load($xmlfile);
$elements = $dom->documentElement;
//print_r(getArray($elements));
$arr=getArray($elements);
print_r($arr);
echo $arr[humans][0][zhangying][0][name][0]."\n"; //张映
echo $arr[humans][0][zhangying][0][name][1]."\n"; //张映2
echo $arr[humans][0][type]; //属性type值
输出结果:
Array
(
[humans] => Array
(
[0] => Array
(
[type] => 1
[id] => 1
[zhangying] => Array
(
[0] => Array
(
[name] => Array
(
[0] => 张映
[1] => 张映2
)
[sex] => Array
(
[0] => 男
)
[old] => Array
(
[0] => 28
)
)
)
[tank] => Array
(
[0] => Array
(
[name] => Array
(
[0] => tank
)
[sex] => Array
(
[0] => 男
)
[old] => Array
(
[0] => 28
)
)
)
)
)
[areas] => Array
(
[0] => Array
(
[beijing] => Array
(
[0] => Array
(
[name] => Array
(
[0] => 北京
)
[oid] => Array
(
[0] => 1
)
)
)
[nanjing] => Array
(
[0] => Array
(
[name] => Array
(
[0] => 南京
)
[oid] => Array
(
[0] => 2
)
)
)
)
)
)
张映
张映2
1