17.7 使用PHP的DOM库处理XML文档
DOM是Document Object Model的缩写。它是在浏览器中使用的、用JavaScript操作的W3C DOM规范。使用DOM可以很容易地将XML文档分析成一个树型结构。PHP中的DOM扩展内容比较庞大,限于篇幅本书不可能一一介绍,本节从宏观和总体角度介绍PHP的DOM扩展,同时挑选一些重要并且常用的函数向读者加以介绍。下面就为读者介绍如何通过DOM在PHP中处理XML文档。
(1)在PHP中使用DOM,首先需要创建一个DOM的实例,即DOMDocument,如下代码所示。
$dom=new DOMDocument;
(2)建立好DOM的实例之后,就可以载入XML到该实例中。有两个方法可以实现载入XML,一是从一个字符串载入,使用函数loadXML(),代码如下所示。
$dom->loadXML('<string>books</string>');
另一种是从文件载入,使用函数load(),代码如下所示。
$dom->load('17-1.xml');
(3)使用DOM对象的documentElement属性可以访问XML文档的根元素。代码17-6演示了使用这个属性获取17-1.xml文档的根元素。
代码17-6 使用DOM对象的documentElement属性获取XML文档根元素17-6.php
01 <?php
02 $dom=new DOMDocument;
03
04 $dom->load('17-1.xml');
05 $root=$dom->documentElement;//获取XML文档根元素
06 ?>
【代码解析】这段代码载入17-1.xml,使用DOM对象的documentElement获取该XML的根元素。代码第5行执行后,变量$root里包含了指向该XML的根元素。
(4)在PHP中可以使用DOM对象的方法saveXML()输出XML字符串,而使用方法save()可以将XML保存为一个XML文件,代码17-7是使用这两个方法的一个完整示例代码。
代码17-7 使用DOM对象的saveXML()和save()方法17-7.php
01 <?php
02 $xml_str="<?xml version='1.0'?>";//以下开始定义XML字符串
03 $xml_str.="<books>";
04 $xml_str.="<book>";
05 $xml_str.="<title>Harry Potter</title>";
06 $xml_str.="<author>J.K.Rowling</author>";
07 $xml_str.="<publisher>Warner Bros.</publisher>";
08 $xml_str.="<price>39.0</price>";
09 $xml_str.="</book>";
10 $xml_str.="</books>";
11
12 $dom=new DOMDocument;
13 $dom->loadXML($xml_str);//载入定义的XML字符串
14
15 echo$dom->saveXML();//将XML输出到一个字符串
16 $dom->save("test.xml");
17 ?>
【代码解析】这段代码通过DOMDcoument对象的loadXML方法,载入事先定义的XML字符串,如代码第13行所示。然后通过saveXML()方法将这段XML输出到一个字符串,然后通过save()方法将这段XML保存为test.xml文件。执行17-7.php后,可以在页面上看到如图17-9所示的结果,同时在当前目录下应该看到一个由17-7.php生成的XML文档文件test.xml。
(5)在PHP中使用DOM的getElementsByTagName()方法,可以返回一个元素的字符数据,该函数接受一个元素名称作为参数。代码17-8演示了该函数的用法。
代码17-8 使用DOM对象的getElementsByTagName()方法17-8.php
01 <?php
02 $doc=new DOMDocument();
03 $doc->load("17-1.xml");//载入指定的XML文档
04
05 $books=$doc->getElementsByTagName("book");//返回book元素的数据
06 foreach($books as$book)//遍历book元素
07 {
08 $authors=$book->getElementsByTagName("author");
09 $author=$authors->item(0)->nodeValue;
10
11 $publishers=$book->getElementsByTagName("publisher");
12 $publisher=$publishers->item(0)->nodeValue;
13
14 $titles=$book->getElementsByTagName("title");
15 $title=$titles->item(0)->nodeValue;
16
17 $prices=$book->getElementsByTagName("price");
18 $price=$prices->item(0)->nodeValue;
19
20 echo"$title-$author-$publisher-$price";
21 echo"<br/>";
22 echo"<br/>";
23 }
24 ?>
这段代码的执行结果如图17-10所示。
【代码解析】这段代码首先使用load()载入XML文档17-1.xml。然后,使用getElementsByName()方法得到指定名称下的所有元素的列表,如代码第5行所示。接着在循环中同样使用get Elements-ByName()方法获得book元素下所有节点的对象,最后获得该节点的nodeValue,nodeValue是节点中的字符数据。
共有条评论 网友评论