当前位置:中国站长下载文章中心网页编程PHP编程 → 在PHP中开发XML应用程序之基础篇

在PHP中开发XML应用程序之基础篇

减小字体 增大字体 作者:编辑整理  来源:互联网  发布时间:2008-9-15 22:04:56
提一下,修改XML是较麻烦的。例如,添加一个目录的代码如下:

PHP:

functionaddCategory(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:
functiondoXML(){
 /*首先创建一个种类列表*/
 varcategories=Array();
 varXMLCategories=xml.getElementsByTagName('categories')[0];
 vartheCategories=XMLCategories.getElementsByTagName('category');
 for(vari=0;i<theCategories.length;i++){
/*注意我们是怎样得到属性的*/
varcid=theCategories[i].getAttribute('cid');
categories[cid]=theCategories[i].firstChild.nodeValue;
 }
 vartheBooks=xml.getElementsByTagName('book');
 for(vari=0;i<theBooks.length;i++){
varbook=theBooks[i];
/*查找标题*/
vartitle=book.getElementsByTagName('title')[0].firstChild.nodeValue;
/*查找作者-为简单起见,我们假定仅有一个作者*/
varauthor=book.getElementsByTagName('author')[0].firstChild.nodeValue;
/*列出种类*/
varbookCategories=book.getElementsByTagName('category');
varcatList='';
for(varj=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属性的值
·元素数据(ElementData)-为了检索包含在一个元素内的文本数据,必须使用(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->categoryas$category){
 $categories[(string)$category['cid']]=(string)$category;
}
?>
<html>
<head>
<title>XMLLibrary</title>
</head>
<body>
<?phpforeach($xml->books->bookas$book):
/*列举目录*/
$catList='';
foreach($book->categoryas$category){
 $catList.=$categories[((string)$category)].',';
}
$catList=substr($catList,0,-2);?>
<div>
<h2><?phpecho($book->title)?></h2>
<p><b>Author:</b>:<?phpecho($book->author)?></p>
<p><b>Categories:</b>:<?phpecho($catList)?></p>
</div>
<?phpendforeach;?>
</html>

七、修改XML

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

PHP:

functionaddCategory(SimpleXMLElement&$sXML,$catID,$catName){
 $xml=newDOMDocument;
 $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='Apache2']-查找所有作为/library/book

上一页  [1] [2] [3]  下一页