PHP XML 外移

PHP XML Expat 解析器

XML是一種流行的半結構化檔案格式,以類似資料庫的格式儲存資料。 在實際應用中,一些簡單的、安全性較低的資料往往使用 XML檔案的格式進行儲存。 這樣做的好處一方面可以透過減少與資料庫的互動性操作來提高讀取效率, 另一方面可以有效利用 XML的優越性來降低程式的編寫難度。

內建的 Expat 解析器使在 PHP 中處理 XML 文件成為可能。

XML 是什麼?

XML是「可擴充性標識語言(eXtensible Markup Language)」的縮寫,是一種類似 HTML的標記性語言。 但是與 HTML不同,XML主要用於描述數據和存放數據,而 HTML主要用於顯示數據。

XML 用於描述數據,其焦點是數據是什麼。 XML 檔案描述了資料的結構。

在 XML 中,沒有預先定義的標籤。您必須定義自己的標籤。

舉例:

   <?xml version="1.0"?>
        <threads>
            <thread>
                <title>Welcome </title>
                <author>Simon </author>
                <content>Welcome to XML guestbook!! </content>
             <thread>
        </threads>

在一個XML檔案的頂部,通常使用<?xml version="1.0"?>來識別XML資料的開始和XML資料使用標準的版本資訊。

<thread>與 <thread>標籤標記了這是一段留言。在留言中有標題、作者、內容,完整的表達了一個留言訊息。

如需學習更多關於 XML 的知識,請造訪我們的 XML 教學。

Expat 是什麼?

如需讀取和更新 - 建立和處理 - 一個 XML 文檔,您需要 XML 解析器。

有兩種基本的 XML 解析器類型:

1. 基於樹的解析器:這個解析器會將 XML 文件轉換為樹型結構。它分析整篇文檔,並提供了對樹中元素的訪問,例如文檔物件模型 (DOM)。

2. 基於事件的解析器:將 XML 文件視為一系列的事件。當某個特定的事件發生時,解析器會呼叫函數來處理。

Expat 解析器是基於事件的解析器。

基於事件的解析器集中在 XML 文件的內容,而不是它們的結構。正因為如此,基於事件的解析器能夠比基於樹的解析器更快存取資料。

請看下面的XML 片段:

<from>Jani</from>

基於事件的解析器把上面的XML 報告為一連串的三個事件:

開始元素:from

開始CDATA 部分,值:Jani

關閉元素:from

上面的XML 實例包含了形式良好的XML。不過這個實例是無效的 XML,因為沒有與它關聯的文件類型聲明 (DTD)。

然而,在使用 Expat 解析器時,這沒有區別。 Expat 是不檢查有效性的解析器,忽略任何 DTD。

作為一款基於事件、非驗證的 XML 解析器,Expat 快速且輕巧,十分適合 PHP 的 Web 應用程式。

註解:XML 文件必須形式良好,否則 Expat 會產生錯誤。

安裝

XML Expat 解析器函數是 PHP 核心的組成部分。無需安裝就可以使用這些函數。

XML 檔案

下面的XML 檔案將會套用在我們的實例中:

<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>


初始化XML 解析器

我們要在PHP 中初始化XML 解析器,為不同的XML 事件定義處理器,然後解析這個XML 文件。

實例

<?php
//初始化XML解析器
$parser=xml_parser_create();
//在元素开始时使用的函数
function start($parser,$element_name,$element_attrs)
{
switch($element_name)
{
case "NOTE":
echo "-- Note --<br>";
break;
case "TO":
echo "To: ";
break;
case "FROM":
echo "From: ";
break;
case "HEADING":
echo "Heading: ";
break;
case "BODY":
echo "Message: ";
}
}
//函数结束时使用的函数
function stop($parser,$element_name)
{
echo "<br>";
}
//查找字符数据时使用的函数
function char($parser,$data)
{
echo $data;
}
//指定元素的处理
xml_set_element_handler($parser,"start","stop");
//指定数据处理程序
xml_set_character_data_handler($parser,"char");
//打开XML文件
$fp=fopen("test.xml","r");
//读取数据
while ($data=fread($fp,4096))
{
xml_parse($parser,$data,feof($fp)) or 
die (sprintf("XML Error: %s at line %d", 
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)));
}
//释放内存
xml_parser_free($parser);
?>

以上程式碼將輸出:

-- Note --
To: Tove
From: Jani
Heading: Reminder
Message: Don't forget me this weekend!

#工作原理:

1. 透過xml_parser_create() 函數初始化XML 解析器

#2 . 建立配合不同事件處理程序的的函數

3. 新增xml_set_element_handler() 函數來定義,當解析器遇到開始和結束標籤時執行哪個函數

4. 新增xml_set_character_data_handler( ) 函數來定義,當解析器遇到字元資料時執行哪個函數

#5. 透過xml_parse() 函數來解析檔案"test.xml"

6. 萬一有錯誤的話,加入xml_error_string() 函數把XML 錯誤轉換成文字說明

7. 呼叫xml_parser_free() 函數來釋放分配給xml_parser_create() 函數的記憶體

更多PHP Expat 解析器的資訊

如需了解更多關於PHP Expat 函數的信息,請造訪我們的 PHP XML Parser 參考手冊。


繼續學習
||
<?php //初始化XML解析器 $parser=xml_parser_create(); //在元素开始时使用的函数 function start($parser,$element_name,$element_attrs) { switch($element_name) { case "NOTE": echo "-- Note --<br>"; break; case "TO": echo "To: "; break; case "FROM": echo "From: "; break; case "HEADING": echo "Heading: "; break; case "BODY": echo "Message: "; } } //函数结束时使用的函数 function stop($parser,$element_name) { echo "<br>"; } //查找字符数据时使用的函数 function char($parser,$data) { echo $data; } //指定元素的处理 xml_set_element_handler($parser,"start","stop"); //指定数据处理程序 xml_set_character_data_handler($parser,"char"); //打开XML文件 $fp=fopen("test.xml","r"); //读取数据 while ($data=fread($fp,4096)) { xml_parse($parser,$data,feof($fp)) or die (sprintf("XML Error: %s at line %d", xml_error_string(xml_get_error_code($parser)), xml_get_current_line_number($parser))); } //释放内存 xml_parser_free($parser); ?>