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 max_execution_time执行时间问题
Jul 17 PHP
PHP中集成PayPal标准支付的实现方法分享
Feb 06 PHP
实现PHP多线程异步请求的3种方法
Jan 17 PHP
PHP实现更新中间关联表数据的两种方法
Sep 01 PHP
PHP滚动日志的代码实现
Jun 10 PHP
必须收藏的php实用代码片段
Feb 02 PHP
PHP进阶学习之垃圾回收机制详解
Jun 18 PHP
ThinkPHP 5.x远程命令执行漏洞复现
Sep 23 PHP
php适配器模式简单应用示例
Oct 23 PHP
PHP设计模式入门之状态模式原理与实现方法分析
Apr 26 PHP
聊聊 PHP 8 新特性 Attributes
Aug 19 PHP
PHP中echo与print区别点整理
Mar 09 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
php开启安全模式后禁用的函数集合
2011/06/26 PHP
php中的注释、变量、数组、常量、函数应用介绍
2012/11/16 PHP
ThinkPHP模型详解
2015/07/27 PHP
PHP针对中英文混合字符串长度判断及截取方法示例
2017/03/31 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
在第一个input框内输入内容.textarea自动得到第一个文件框的值的javascript代码
2007/04/20 Javascript
使用户点击后退按钮使效三行代码
2007/07/07 Javascript
测试你的JS的掌握程度的代码
2009/12/09 Javascript
Jquery CheckBox全选方法代码附js checkbox全选反选代码
2010/06/09 Javascript
基于jQuery的的一个隔行变色,鼠标移动变色的小插件
2010/07/06 Javascript
jquery全选checkBox功能实现代码(取消全选功能)
2013/12/10 Javascript
js统计页面的来访次数实现代码
2014/05/09 Javascript
浅谈关于JavaScript API设计的一些建议和准则
2015/06/24 Javascript
通过javascript进行UTF-8编码的实现方法
2016/06/27 Javascript
vue-resouce设置请求头的三种方法
2017/09/12 Javascript
前端路由&amp;webpack基础配置详解
2019/06/10 Javascript
vue实现短信验证码登录功能(流程详解)
2019/12/10 Javascript
python使用新浪微博api上传图片到微博示例
2014/01/10 Python
Python常用模块介绍
2014/11/21 Python
Python函数式编程指南(四):生成器详解
2015/06/24 Python
详解Python验证码识别
2016/01/25 Python
Python中音频处理库pydub的使用教程
2017/06/07 Python
pytorch载入预训练模型后,实现训练指定层
2020/01/06 Python
Python魔术方法专题
2020/06/19 Python
python中判断文件结束符的具体方法
2020/08/04 Python
Visual Studio code 配置Python开发环境
2020/09/11 Python
用HTML5的canvas实现一个炫酷时钟效果
2016/05/20 HTML / CSS
浅谈html5 video 移动端填坑记
2018/01/15 HTML / CSS
美国折扣网站:jClub
2017/08/07 全球购物
eBay英国购物网站:eBay.co.uk
2019/06/19 全球购物
伦敦香水公司:The London Perfume Company
2019/11/13 全球购物
资源工程专业毕业生求职信
2014/02/27 职场文书
外贸员简历中的自我评价
2014/03/04 职场文书
药剂专业个人求职信范文
2014/04/29 职场文书
公司联欢会主持词
2015/07/04 职场文书
Python实现聚类K-means算法详解
2022/07/15 Python