您的位置:首页 > 编程语言 > PHP开发

Php 解析XML文件

2015-10-20 19:47 686 查看
需要解析的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>


程序1:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: