一、 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>