有一次我拿到了個處理 XML 檔案的活兒。這個 XML 檔案是用來跟 Flash mp3 播放器做通訊使用的,包含了音樂的地址、描述等。我需要做的僅僅是讓管理員可以通過一個表單完成添加、刪除音樂項並更新 XML 檔案。聽起來很簡單吧?但我卻在做刪除功能時遇到了麻煩。在我花了無數時間抓耳撓腮想辦法、搜尋、翻閱官方 PHP 文檔裡關於 DOM XML 的內容時,DomIt! 及時地出現了(其實是我及時地找到了)。DomIt! 非常的強大、易用(至少拿來做簡單的處理工作時)、相容 PHP4,並且在願意細讀它的原始碼時協助你快速地學好 DOM XML。
當時需要的 XML 檔案為如下格式:
<?xmlversion="1.0"?>
<audio>
<file>
<track>音樂檔案位置</track>
<caption>音樂檔案標題</caption>
<record>音樂錄製資訊</record>
</file>
</audio>
當然,這個 XML 檔案在我接這活兒的時候已經預先給了。但我想使用 DomIt! 建立這樣的一個檔案作為本系列的第一部分內容,同時也是為了展示 DomIt! 的強大和易用。
首先我們要做的是調用 DomIt! 的庫檔案(到這裡,下載、解壓 DomIt! 庫並將所有的檔案放入與下面將要建立的程式檔案相同的目錄),並建立一個 DomIt! 文檔執行個體:
require_once('xml_domit_include.php');
$xmlDoc=&newDOMIT_Document();// 文檔執行個體
注意“&”符號是用來相容 PHP4 的。
這樣我們就準備好一個執行個體可以按需使用了。看到 XML 檔案內容中的第一行了嗎?沒錯,我們要添加 XML 的檔案聲明:
$xmlDecl=&$xmlDoc->createProcessingInstruction('xml','version="1.0"');
$xmlDoc->appendChild($xmlDecl);
在這我們可以看到聲明資訊也被當作是一個子節點做處理,也算是合理的定義。但這裡我們可以發現 createProcessingInstruction() 方法存在一個明顯的缺點——只有兩個聲明參數(通常我們可能還會定義編碼之類的 XML 聲明資訊)。幸運的是我們使用的是一個開源的庫,也就是說我們可以輕易地將它修改定製以滿足要求。如果你實在需要協助來修改這個特定的方法以添加足夠的 XML 檔案聲明資訊(如編碼等),我將在本系列的最後一篇中加以介紹。
讓我們回到正題。完成 XML 檔案聲明部分後,我們在 XML 檔案內容中看到的是“audio”標籤。它是這個 XML 檔案中的根項目(根節點)。讓我們來建立這部分:
$rootElement=&$xmlDoc->createElement('audio');
$xmlDoc->appendChild($rootElement);
你不需要擔心標籤關閉的問題,DomIt! 已經完全替你做好了。利用類似的方法,我們將建立“audio”的子節點——“file”元素;在“file”元素內,還包含了幾個姊妹元素“track”、“caption”和“record”及它們的文字內容。既然建立它們時都要用到一個主要的方法 appendChild(),我們可以歸納到一起說:
// "file" 元素
$fileElement=&$xmlDoc->createElement('file');
// "track" 元素
$trackElement=&$xmlDoc->createElement('track');
// 增加"track"元素的常值內容
$trackElement->appendChild($xmlDoc->createTextNode('音樂檔案位置'));
// 添加到"file"元素中去
$fileElement->appendChild($trackElement);
// "caption" 元素,其他同"track"
$captionElement=&$xmlDoc->createElement('caption');
$captionElement->appendChild($xmlDoc->createTextNode('音樂檔案標題'));
$fileElement->appendChild($captionElement);
// "record" 元素,其他同"track"
$recordElement=&$xmlDoc->createElement('record');
$recordElement->appendChild($xmlDoc->createTextNode('音樂錄製資訊'));
$fileElement->appendChild($recordElement);
就像之前說的,核心部分是 appendChild() 方法。在不同的執行個體上調用它就可以起到不同的作用(這就是物件導向)。如果你用 appendChild() 將“track”元素添加進“audio”,那“file”和“track”就變成姊妹節點了。
完成建立所有節點的工作後,我們需要將這些內容添加進“audio”元素,或許你還想將最後的內容輸出到螢幕上查看、以及儲存到真正的 XML 檔案中去:
// 添加所有"file"元素裡的內容到"audio"裡
$rootElement->appendChild($fileElement);
// 在螢幕上(網頁)列印出來
echo$xmlDoc->toNormalizedString(true);
// 將文檔執行個體儲存進一個真正的 XML 檔案中
$xmlDoc->saveXML('audio.xml',true);
然後在螢幕上(瀏覽器中),你可以看到:
<?xmlversion="1.0"?>
<audio>
<file>
<track>音樂檔案位置</track>
<caption>音樂檔案標題</caption>
<record>音樂錄製資訊</record>
</file>
</audio>
與給我的檔案內容一模一樣。這就是《用 DomIt! 做簡單的 XML 處理工作》第一部分的結尾。下一篇,我將談談如何修改我們剛剛建立的 XML 檔案,包括對內容的添加、刪除和編輯。
哦,我還忘了給你們一個 DomIt! 明顯的下載連結(我知道可能你們很多人已經 Google 出來了):http://sourceforge.net/projects/domit-xmlparser/
到這裡下載一份 DomIt!,並且可以在下一篇出爐前讀讀它的文檔。