PHP基础之使用DOM解析xml

还是解析xml文档,不同的是使用另一种方法,上一篇中记录的是用Expat解析xml,这一篇使用DOM解析,这两者的区别在于,Expat解析xml时不会一次将文档全部读入内存,而DOM解析则会一次性将文档读入内存,我们还是用上一篇中的xml文档,xml文件的内容如下:

<?xml version="1.0" encoding="utf-8"?>
<person id="1">
	<name>zhangsan</name>
	<age>21</age>
	<job>teacher</job>
	<sex>male</sex>
	<company>IBM</company>
</person>
下面是解析该xml文件的php代码:

<?php
	$xmlDoc = new DOMDocument();
	$xmlDoc->load("data.txt");
	$persons = $xmlDoc->getElementsByTagName("person");
	foreach($persons as $person){
		$id = $person->attributes->item(0)->nodeValue;
		echo "id = $id<br/>";

		$name = getNodeValueByName($person, "name");
		echo "name = $name<br/>";

		$age = getNodeValueByName($person, "age");
		echo "age = $age<br/>";

		$sex = getNodeValueByName($person, "sex");
		echo "sex = $sex<br/>";

		$job = getNodeValueByName($person, "job");
		echo "job = $job<br/>";

		$company = getNodeValueByName($person, "company");
		echo "company = $company<br/>";
	}

	function getNodeValueByName($person, $nodeName){
		$nodes = $person->getElementsByTagName($nodeName);
		return $nodes->item(0)->nodeValue;
	}
?>
在浏览器中访问的结果如下图所示:

PHP基础之使用DOM解析xml_第1张图片

上面的代码中需要注意的是,这里编写了一个公用的函数getNodeValueByName()用于获取某个标签中的值,其中参数$person为一个person标签对应的DOMElement对象,需要使用$person->getElementsByTagName()函数,获取person标签下某个子标签的集合$nodes,然后用$nodes->item(0)获取第一个标签对应的元素,最后用nodeValue取到该标签的值。还要注意的一个地方是取person的id时,因为$xmlDoc->getElementsByTagName("person");获取的也是person节点的集合,所以我们要用foreach循环取person,尽管我们的xml文件中只有一个person标签,在取id时,我们使用的是$person->attributes->item(0)->nodeValue;因为person标签中可能有多个attribute,所以$person->attributes获取到的是attributes的集合,也要使用Item(0)得到第一个attribute即id

你可能感兴趣的:(PHP,xml解析,dom解析)