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是节点中的字符数据。