四、 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> |
再提一下,修改XML是较麻烦的。例如,添加一个目录的代码如下:
PHP:
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> |
 
说明:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
2/2 首页 上一页 1 2 |