文章教程

17.5使用PHP的DOM库处理XML文档

9/17/2020 9:31:19 PM 人评论 次浏览

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

教程类别