Php 解析XML文件

需要解析的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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值