PHP中开发XML应用程序之基础篇 添加节点 删除节点(2)


<?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:

复制代码 代码如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/33a5c0bdfed51612c1c167fc98659265.html