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 相关文章推荐
MVC模式的PHP实现
Oct 09 PHP
PHP新手上路(九)
Oct 09 PHP
php学习之 认清变量的作用范围
Jan 26 PHP
php图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
Dec 02 PHP
记录PHP错误日志 display_errors与log_errors的区别
Oct 09 PHP
Laravel 4 初级教程之Pages、表单验证
Oct 30 PHP
php中Array2xml类实现数组转化成XML实例
Dec 08 PHP
php通过Chianz.com获取IP地址与地区的方法
Jan 14 PHP
分享php分页的功能模块
Jun 16 PHP
我整理的PHP 7.0主要新特性
Jan 07 PHP
一个简单安全的PHP验证码类、PHP验证码
Sep 24 PHP
Zend Framework入门应用实例详解
Dec 11 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中用文本文件做数据库的实现方法
2008/03/27 PHP
PHP的基本常识小结
2013/07/05 PHP
php生成gif动画的方法
2015/11/05 PHP
我的Node.js学习之路(三)--node.js作用、回调、同步和异步代码 以及事件循环
2014/07/06 Javascript
jQuery使用之标记元素属性用法实例
2015/01/19 Javascript
javascript多行字符串的简单实现方式
2015/05/04 Javascript
JS实现选中当前菜单后高亮显示的导航条效果
2015/10/15 Javascript
Javascript实现Array和String互转换的方法
2015/12/21 Javascript
深入浅析JavaScript中数据共享和数据传递
2016/04/25 Javascript
JS读取XML文件数据并以table形式显示数据的方法(兼容IE与火狐)
2016/06/02 Javascript
JS阻止事件冒泡行为和闭包的方法
2016/06/16 Javascript
javascript prototype原型详解(比较基础)
2016/12/26 Javascript
JavaScript简单拖拽效果(1)
2017/05/17 Javascript
浅谈Angular 观察者模式理解
2018/11/01 Javascript
解决vue跨域axios异步通信问题
2019/04/17 Javascript
JS 创建对象的模式实例小结
2020/04/28 Javascript
vue中全局路由守卫中替代this操作(this.$store/this.$vux)
2020/07/24 Javascript
[00:30]明星选手化身超级英雄!2018DOTA2亚洲邀请赛全明星赛来临!
2018/04/06 DOTA
[46:37]LGD vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python对url格式解析的方法
2015/05/13 Python
Python中用psycopg2模块操作PostgreSQL方法
2017/11/28 Python
python互斥锁、加锁、同步机制、异步通信知识总结
2018/02/11 Python
Windows下将Python文件打包成.EXE可执行文件的方法
2018/08/03 Python
python垃圾回收机制(GC)原理解析
2019/12/30 Python
关于tensorflow的几种参数初始化方法小结
2020/01/04 Python
在TensorFlow中屏蔽warning的方式
2020/02/04 Python
美国知名生活购物网站:Goop
2017/11/03 全球购物
主持词开场白
2014/03/17 职场文书
感恩教育活动总结
2014/05/05 职场文书
2015年公务员个人工作总结
2015/04/24 职场文书
2015学校图书管理员工作总结
2015/05/11 职场文书
赢在执行观后感
2015/06/16 职场文书
关于法制教育的宣传语
2015/07/13 职场文书
建议书的格式及范文
2015/09/14 职场文书
一年之计:2019年下半年的计划
2019/05/07 职场文书
原生JS实现飞机大战小游戏
2021/06/09 Javascript