PHP中开发XML应用程序之基础篇 添加节点 删除节点 查询节点 查询节


Posted in PHP onJuly 09, 2010

一、 XML简介

XML(可扩展的标注语言)是一种W3C标准,主要用于Web应用程序和服务器之间实现容易的交互、数据的存储与使用。

使用XML标准编码的数据具有能容易被人和计算机解释的意义和结构。XML数据是平台和应用程序独立的。不用多说,这本身就使XML成为适合于互联网的一个理想的数据交换格式(事实上,它正是因这一用途而被开发的)。最近,宽带连接的增长及消费者对于越过任何媒体进行数据共享的应用软件的需求意味着,XML Web服务和应用软件正变得越来越丰富。

XML的发明正是为了解决描述网上丰富的数据的组织问题;而目前为止,这一问题仅能够通过HTML的巧妙使用得到部分地解决。

下面是一XML文档的实例:
程序代码

<?xml version="1.0"?> 
<party> 
 <location>My House</location> 
 <time>7pm</time> 
 <guest> 
<name>John Bloggs</name> 

<item>Crate of Fosters</item> 
 </guest> 
 <guest> 

<name>Sara Bloggs</name> 

<item>Umbrella</item> 
 </guest> 
 <guest> 

<name>David Fig</name> 

<item>Bombay Mix</item> 
 </guest> 
</party>

如果你以前没见过XML,那么你可以认为它看起来象HTML。HTML是一种SGML应用程序,而XML是它的一个子集。然而,其相似性还包括它们具有相似的标注分隔符。

仅需看一下上面的XML片断,我们就能看到,该数据是描述一个具有一些客人的聚会;其中,每一个客人相应于一项。用于描述数据的标签名完全由作者来选择。所有XML标准要求:数据必须是一致的并且用于描述数据的标签为良构的。我们可以进一步用一种文档类型声明(DTD)或一个XML模式来强制数据的完整性。然而为简化起见,我们在本文中将仅使用普通的XML。

二、 XML应用程序

刚才,我们已经看到了如何使用XML来描述任何种类的数据。事实上,XML已经在今天的许多Web应用程序中得到广泛使用,下面是一些著名的应用描述:

· XHTML-这是使用最广泛的XML应用程序之一。它类似基于HTML的SGML-用于描述数据在网页上的显示方式。XHTML使用一DTD来确保所有的文档遵循标准。XHTML的出现使Web程序员的开发稍微容易了一些;然而,一种完全兼容于CSS和XHTML标准的web浏览器尚未出现。

· XML-RPC-远程过程调用(RPC),应用于分布式应用程序中以调用远程计算机上的过程。XML-RPC使用XML对关于过程调用的信息进行编码,并且使用HTTP把它发送到接收计算机。然后,过程的返回值被再次用XML编码并用HTTP连接发送回调用者计算机。

· RSS-真正简单的聚合/丰富的站点摘要,它是一种用来聚合web站点内容(例如新闻、文章、共享价格和链接等)的方法,它用一个特殊的应用程序(一个聚合器)定期更新用户PC上的RSS回馈。该RSS数据是使用XML进行编码和传输的。

· AJAX-异步的JavaScript和XML,允许web开发者创建具有丰富特征的事件驱动的运行在web浏览器上的web应用程序。其中,JavaScript用于把XML编码的数据发送到服务器端脚本(或从服务器端接收XML编码的数据),并允许局部的实时的页面更新而不需要更新所有页面内容。

上面仅仅是XML的可能的应用的一部分。在以后文章中,我们将分析如何在PHP中使用这些应用软件。

三、 在PHP中使用XML

自从PHP 5.0以来,PHP能与XML交互的可用选项显著地增加。而PHP版本4所能提供的是不稳定的而且是非w3c兼容的DOM XML扩展。
下面,我将集中讨论PHP 5所提供给我们的三个允许我们与XML交互的方法:DOM,简单XML和XPath。在可能之处,我将建议最适合于每种方法的条件和数据。所有的示例代码将使用XML数据源来描述一个库及其中包含的书。

程序代码

<xml version="1.0"?> 
<library> 
 <categories> 
<category cid="1">Web Development</category> 

<category cid="2">Database Programming</category> 

<category cid="3">PHP</category> 

<category cid="4">Java</category> 
 </categories> 
 <books> 
 <book> 

<title>Apache 2</title> 

<author>Peter Wainwright</author> 

<publisher>Wrox</publisher> 

<category>1</category> 
 </book> 
 <book> 

<title>Advanced PHP Programming</title> 

<author>George Schlossnagle</author> 

<publisher>Developer Library</publisher> 

<category>1</category> 

<category>3</category> 
 </book> 
 <book> 

<title>Visual FoxPro 6 - Programmers Guide</title> 

<author>Eric Stroo</author> 

<publisher>Microsoft Press</publisher> 

<category>2</category> 
 </book> 
 <book> 

<title>Mastering Java 2</title> 

<author>John Zukowski</author> 

<publisher>Sybex</publisher> 

<category>4</category> 
 </book> 
</books> 
</library>

四、 DOM

DOM PHP扩展名允许使用W3C DOM API在XML文档上进行操作。在PHP 5出现之前,这是PHP能存取XML文档的唯一方法。如果你在JavaScript中使用了DOM,那么会认识到这些对象模型几乎是一样的。

由于DOM方法在遍历和操作XML文档时比较罗嗦,所以任何DOM兼容的代码都有明显的优点-与任何其它实现相同的W3C兼容的对象模型的API兼容。

在下面的实例代码中,我们使用DOM来显示关于每本书的信息。首先,我们遍历一下列表目录,把它们的Id和相应的名字装载到一个索引数组中。然后,我们显示每本书的一个简短描述:

PHP:

<?php 
 /*这里我们必须指定XML版本:也即是1.0 */ 
 $xml = new DomDocument('1.0'); 
 $xml->load('xml/library.xml'); 
 /*首先,创建一个目录列表*/ 
 $categories = array(); 
 $XMLCategories = $xml->getElementsByTagName('categories')->item(0); 
 foreach($XMLCategories->getElementsByTagName('category') as $categoryNode) { 
/*注意我们是如何得到属性的*/ 

$cid = $categoryNode->getAttribute('cid'); 

$categories[$cid] = $categoryNode->firstChild->nodeValue; 
 } 
?> 
<html> 
<head> 
<title>XML Library</title> 
</head> 
<body> 
<? 
 php foreach($xml->getElementsBytagName('book') as $book): 
 /*查找标题*/ 
 $title = $book->getElementsByTagName('title')->item(0)->firstChild->nodeValue; 
 /*查找作者-为了简化起见,我们假设仅仅有一个作者*/ 
 $author = $book->getElementsByTagName('author')->item(0)->firstChild->nodeValue; 
 /* 列表目录*/ 
 $bookCategories = $book->getElementsByTagName('category'); 
 $catList = ''; 
 foreach($bookCategories as $category) { 

$catList .= $categories[$category->firstChild->nodeValue] . ', '; 
 } 
 $catList = substr($catList, 0, -2); ?> 
<div> 
<h2><?php echo($title) ?></h2> 
<p><b>Author:</b>: <?php echo($author) ?></p> 
<p><b>Categories: </b>: <?php echo($catList) ?></p> 
</div> 
<? php endforeach; ?> 
</html> 
[html] 

再提一下,修改XML是较麻烦的。例如,添加一个目录的代码如下: 

PHP: 
[code] 
function addCategory(DOMDocument $xml, $catID, $catName) { 
 $catName = $xml->createTextNode($catName); //创建一个结点以存储文本 
 $category = $xml->createElement('category'); //创建一个目录元素 
 $category->appendChild($catName); //把文本添加到目录元素上 
 $category->setAttribute('cid', $catID); //设置目录的ID 
 $XMLCategories = $xml->getElementsByTagName('categories')->item(0); 
 $XMLCategories->appendChild($category); //添加新目录 
}

  五、 保存XML

你可以使用save()和saveXML()方法之一来把DOM描述转换回XML字符串描述。save()方法用一指定的命名把XML保存到一个文件中,而saveXML()从文档的部分或整体中返回一个字符串。

$xml->save('xml/library.xml');
//保存全部文件
$categories=$xml->saveXML($XMLCategories);
//返回一个包含种类的字符串

为了说明把DOM兼容的代码移植到另外的语言是如何容易,下面是用JavaScript形式实现的与以上功能相同的代码:

Javascript:

function doXML(){ 
 /* 首先创建一个种类列表*/ 
 var categories = Array(); 
 var XMLCategories = xml.getElementsByTagName('categories')[0]; 
 var theCategories = XMLCategories.getElementsByTagName('category'); 
 for (var i = 0; i < theCategories.length; i++) { 
/* 注意我们是怎样得到属性的*/ 

var cid = theCategories[i].getAttribute('cid'); 

categories[cid] = theCategories[i].firstChild.nodeValue; 
 } 
 var theBooks = xml.getElementsByTagName('book'); 
 for(var i = 0; i < theBooks.length; i++) { 

var book = theBooks[i]; 

/* 查找标题*/ 

var title = book.getElementsByTagName('title')[0].firstChild.nodeValue; 

/* 查找作者-为简单起见,我们假定仅有一个作者*/ 

var author = book.getElementsByTagName('author')[0].firstChild.nodeValue; 

/* 列出种类*/ 

var bookCategories = book.getElementsByTagName('category'); 

var catList = ''; 

for(var j = 0; j < bookCategories.length; j++) { 

 catList += categories[bookCategories[j].firstChild.nodeValue] + ', '; 

} 

catList = catList.substring(0, catList.length -2); 

document.open(); 

document.write("<h2>" + title + "</h2>"); 

document.write("<p><b>Author:</b>: " + author + "</p>"); 

document.write("<p><b>Categories: </b>: " + catList + "</p>"); 
 } 
 document.close(); 
}

六、 简单XML


简单XML确实简单。它允许使用对象和数组存取方法来存取一个XML文档及其元素和属性。操作方式很简单:

· 元素(Element)-这些被描述为SimpleXMLElement对象的单个属性。当有多个作为文档或元素的子元素存在时,每个元素能被使用数组索引标志加以存取。

$xml->books;//返回元素"books"
$xml->books->book[0];//返回在books元素中的第一本书

· 属性(Attribute)-元素的属性是通过关联数组标志来存取和设置的,此时每一个索引对应于一个属性名。

$category['cid'];//返回cid属性的值

· 元素数据(Element Data)-为了检索包含在一个元素内的文本数据,必须使用(string)显式地把它被转换为一个字符串或使用print或echo输出它。如果一个元素包含多个文本结点,那么它们将按被找到的顺序连接起来。

echo ($xml->books->book[0]->title);//显示第一本书的标题

下面是使用简单XML进行转换的原来的实例。为了装载XML文件,我们使用simplexml_load_file()函数,由它来分析该XML文件并且把它装载进一个SimpleXMLElement对象中:

PHP:

<?php 
$xml = simplexml_load_file('xml/library.xml'); 
/* 把一个列表的目录装载到一个数组中*/ 
$categories = array(); 
foreach($xml->categories->category as $category) { 
 $categories[(string) $category['cid']] = (string) $category; 
} 
?> 
<html> 
<head> 
<title>XML Library</title> 
</head> 
<body> 
<?php foreach($xml->books->book as $book): 
/* 列举目录*/ 
$catList = ''; 
foreach($book->category as $category) { 
 $catList .= $categories[((string) $category)] . ', '; 
} 
$catList = substr($catList, 0, -2); ?> 
<div> 
<h2><?php echo($book->title) ?></h2> 
<p><b>Author:</b>: <?php echo($book->author) ?></p> 
<p><b>Categories: </b>: <? php echo($catList) ?></p> 
</div> 
<? php endforeach; ?> 
</html>

七、 修改XML

尽管文本数据和属性值可以通过使用简单XML加以设置,但是不能新建这些对象。然而,SimpleXM的确提供了一种方法来实现DomElement对象和DomElement对象之间的转换。为此,我修改了addCategory()函数来说明如何使用simplexml_import_dom()函数以添加目录和把该文档转换回简单的XML格式:

PHP:

function addCategory(SimpleXMLElement &$sXML, $catID, $catName) { 
 $xml = new DOMDocument; 
 $xml->loadXML($sXML->asXML()); 
 $catName = $xml->createTextNode($catName); //创建一个结点来存放该文本 
 $category = $xml->createElement('category'); //创建一个目录元素 
 $category->appendChild($catName); //把文本添加到目录元素 
 $category->setAttribute('cid', $catID); //设置目录id 
 $XMLCategories = $xml->getElementsByTagName('categories')->item(0); 
 $XMLCategories->appendChild($category); //添加新目录 
 $sXML = simplexml_import_dom($xml); 
 return $sXML; 
}

同样,SimpleXMLElement对象的asXML()函数可以用来检索XML字符串并把它保存回一个文件中。

八、 xPath

毫无疑问,Xpath是"XML蛋糕之上的樱桃"。XPath允许你使用象SQL一样的查询来查找一个XML文档中的特定信息。DOM和SimpleXML都有内置的对XPath的支持,如SQL,可以被用来提取你想从一XML文档中提取的任何内容。

  程序代码
 · //category-查找所有的在文档中出现的任何category。

· /library/books-查找所有作为library的孩子出现的books

· /library/categories/category[@cid]-查找所有作为library/categories的孩子出现且属性为cid的category。

· /library/categories/category[@att='2']-查找所有作为library/categories的孩子且具有属性cid的值为2出现的category。

· /library/books/book[title='Apache 2']-查找所有作为/library/books的孩子且其标题元素有一个值为Apache 2出现的book。

其实,这仅是xPath冰山之一角。你可以使用xPath来创建大量复杂的查询以便从你的文档中提取几乎任何信息。我再次修改了示例代码来向你展示使用xPath是多么轻松愉快的事情。

PHP:

<?php 
$xml = simplexml_load_file('xml/library.xml'); 
?> 
<html> 
<head> 
<title>XML Library</title> 
</head> 
<body> 
<?php foreach(((array)$xml->xpath("/library/books/book")) as $book): 
/*列表目录*/ 
$catList = ''; 
foreach($book->category as $category) { 
 /*得到具有这个ID的目录*/ 
 $category = $xml->xpath("/library/categories/category[@cid='$category']"); 
 $catList .= (string) $category[0] . ', '; 
} 
$catList = substr($catList, 0, -2); ?> 
<div> 
<h2><?php echo($book->title) ?></h2> 
<p><b>Author:</b>: <?php echo($book->author) ?></p> 
<p><b>Categories: </b>: <?php echo($catList) ?></p> 
</div> 
<?php endforeach; ?> 
</html>

九、 DOM和XPath

在DOM中计算XPath查询需要创建一个DOMXPath对象,下面的evaluate()函数返回一个DOMElement数组。

$xPath = new DOMXPath($xml); 
$xPath->evaluate("/library/books/book[title='Apache 2']");

十、 结论

现在,我们学习了如何使用了PHP提供给我们的工具来与XML交互。至此,我们已经被"武装起来"并准备好深入钻研XML应用程序了。在下一篇文章中,我们将讨论AJAX及其如何应用于象Google这样的站点开发的。

PHP 相关文章推荐
用PHP创建PDF中文文档
Oct 09 PHP
PHP MVC模式在网站架构中的实现分析
Mar 04 PHP
php 带逗号千位符数字的处理方法
Jan 10 PHP
php实现获取局域网所有用户的电脑IP和主机名、及mac地址完整实例
Jul 18 PHP
Discuz7.2版的faq.php SQL注入漏洞分析
Aug 06 PHP
php验证session无效的解决方法
Nov 04 PHP
php 5.6版本中编写一个PHP扩展的简单示例
Jan 20 PHP
使用图灵api创建微信聊天机器人
Jul 23 PHP
php 流程控制switch的简单实例
Jun 07 PHP
PHPTree――php快速生成无限级分类
Mar 30 PHP
php unlink()函数使用教程
Jul 12 PHP
Laravel访问出错提示:`Warning: require(/vendor/autoload.php): failed to open stream: No such file or di解决方法
Apr 02 PHP
php set_magic_quotes_runtime() 函数过时解决方法
Jul 08 #PHP
PHP 函数学习简单小结
Jul 08 #PHP
PHP 5.3.1 安装包 VC9 VC6不同版本的区别是什么
Jul 04 #PHP
PHP三层结构(上) 简单三层结构
Jul 04 #PHP
Apache 配置详解(最好的APACHE配置教程)
Jul 04 #PHP
PHP中文URL编解码(urlencode()rawurlencode()
Jul 03 #PHP
php的一些小问题
Jul 03 #PHP
You might like
Apache, PHP在Windows 9x/NT下的安装与配置 (一)
2006/10/09 PHP
php email邮箱正则
2008/10/08 PHP
晋城吧对DiscuzX进行的前端优化要点
2010/09/05 PHP
ubuntu下编译安装xcache for php5.3 的具体操作步骤
2013/06/18 PHP
PHP实现链式操作的三种方法详解
2017/11/16 PHP
PHP PDOStatement::closeCursor讲解
2019/01/30 PHP
jquery插件之easing使用
2010/08/19 Javascript
javaScript 计算两个日期的天数相差(示例代码)
2013/12/27 Javascript
JavaScript实现表格点击排序的方法
2015/05/11 Javascript
浅谈javascript中return语句
2015/07/15 Javascript
基于jquery实现可定制的web在线富文本编辑器附源码下载
2015/11/17 Javascript
jquery中checkbox使用方法简单实例演示
2015/11/24 Javascript
AngularJS控制器继承自另一控制器
2016/05/09 Javascript
JavaScript的React Web库的理念剖析及基础上手指南
2016/05/10 Javascript
Highcharts学习之坐标轴
2016/08/02 Javascript
JS Testing Properties 判断属性是否在对象里的方法
2017/10/01 Javascript
Angular 开发学习之Angular CLI的安装使用
2017/12/31 Javascript
Vue-cli配置打包文件本地使用的教程图解
2018/08/02 Javascript
vue项目从node8.x升级到12.x后的问题解决
2019/10/25 Javascript
在Python 3中实现类型检查器的简单方法
2015/07/03 Python
python实现web方式logview的方法
2015/08/10 Python
举例讲解Python的lambda语句声明匿名函数的用法
2016/07/01 Python
Django之路由层的实现
2019/09/09 Python
理肤泉英国官网:La Roche-Posay英国
2019/01/14 全球购物
捷克玩具商店:Bambule
2019/02/23 全球购物
linux面试题参考答案(9)
2016/01/29 面试题
高中微机老师自我鉴定
2014/02/16 职场文书
干部对照检查材料范文
2014/08/26 职场文书
2014年乡镇领导个人整改措施
2014/09/19 职场文书
毕业生代领毕业材料的授权委托书
2014/09/29 职场文书
教师求职自荐信
2015/03/26 职场文书
2015医院个人工作总结范文
2015/05/21 职场文书
教师工作证明范本
2015/06/12 职场文书
初中教务主任竞聘演讲稿(范文)
2019/08/20 职场文书
用python开发一款操作MySQL的小工具
2021/05/12 Python
浅谈Python中的函数(def)及参数传递操作
2021/05/25 Python