17.5使用PHP的DOM库处理XML文档
17.5 使用PHP的DOM库处理XML文档
当然,PHP除了使用SimpleXML处理XML文档外,还提供DOM库来实现同样的处理。它与SimpleXML相比提供的功能要强大许多。
17.5.1 什么是DOM
DOM是Document Object Model的缩写。它是在浏览器中使用的、用JavaScript操作的W3C DOM规范。使用DOM可以很容易地将XML文档分析成一个树形结构。PHP中的DOM扩展内容比较庞大,本书限于篇幅不可能一一介绍,本节从宏观和总体角度介绍PHP的DOM扩展,同时挑选一些重要并且常用的函数向读者加以介绍。
17.5.2 通过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的根元素。代码第05行执行后,变量$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的getElementsByTag-Name()方法,可以返回一个元素的字符数据,该函数接受一个元素名称作为参数。代码17-8演示了该函数的用法,执行结果如图17-10所示。
代码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-9 使用saveXML()和save()

图17-10 使用DOM对象的getElementsByTagName()方法
【代码解析】代码首先使用load()载入XML文档17-1.xml,然后使用getElementsByName()方法得到指定名称下的所有元素的列表,如代码第5行所示。接着在循环中同样使用getElementsByName()方法获得book元素下所有节点的对象,最后获得该节点的nodeValue,nodeValue是节点中的字符数据。
下一篇:17.6小结
