还是解析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; } ?>在浏览器中访问的结果如下图所示:
上面的代码中需要注意的是,这里编写了一个公用的函数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