PHP - SAX 解析器範例:初學者指南

你好,未來的 PHP 巫師們!今天,我們將踏上一段令人興奮的旅程,進入 PHP 中 SAX 解析的世界。別擔心如果你之前從未聽過 SAX —— 到了這個教學結束時,你將能像專業人士一樣解析 XML!

PHP - SAX Parser Example

SAX 解析是什麼?

在我們深入研究代碼之前,讓我們先來了解一下 SAX 解析是什麼。SAX 的全稱是 "Simple API for XML"。它是讀取 XML 文档的一種方式,特別是在處理大文件或當你想在讀取時就處理 XML,而不是將整個文件加載到內存中時非常有用。

想像你在讀一本書。SAX 解析就像逐頁讀書,理解你讀到的每一頁,而不是試圖一次性記住整本書。酷炫吧?

在 PHP 中開始使用 SAX

PHP 使用內置的 XML 解析器使得 SAX 解析變得非常簡單。讓我們從一個簡單的例子開始:

<?php
$parser = xml_parser_create();
xml_parse($parser, "<book><title>PHP for Beginners</title></book>");
xml_parser_free($parser);
?>

在這段代碼中,我們創建了一個解析器,解析了一個簡單的 XML 字符串,然後釋放了解析器。但這還沒有做很多事情。要讓我們的解析器變得有用,我們需要告訴它在遇到 XML 的不同部分時應該做什麼。這就是我們的處理器函數的作用!

XML 元素處理器

xml_set_element_handler() 函數允許我們指定當解析器遇到元素的開始和結束時會發生什麼。讓我們看看它是如何工作的:

<?php
function start_element($parser, $element_name, $element_attrs) {
echo "開始元素:$element_name<br>";
}

function end_element($parser, $element_name) {
echo "結束元素:$element_name<br>";
}

$parser = xml_parser_create();
xml_set_element_handler($parser, "start_element", "end_element");

$xml = "<book><title>PHP for Beginners</title><author>John Doe</author></book>";
xml_parse($parser, $xml);
xml_parser_free($parser);
?>

這個腚本將輸出:

開始元素:BOOK
開始元素:TITLE
結束元素:TITLE
開始元素:AUTHOR
結束元素:AUTHOR
結束元素:BOOK

如你所見,我們的 start_element 函數在遇到開標籤時被調用,而 end_element 在遇到閉標籤時被調用。

字符數據處理器

那麼標籤之間的文本呢?這就是 xml_set_character_data_handler() 的用武之地:

<?php
function char_data($parser, $data) {
echo "字符數據:" . trim($data) . "<br>";
}

$parser = xml_parser_create();
xml_set_character_data_handler($parser, "char_data");

$xml = "<book><title>PHP for Beginners</title><author>John Doe</author></book>";
xml_parse($parser, $xml);
xml_parser_free($parser);
?>

這將輸出:

字符數據:PHP for Beginners
字符數據:John Doe

處理指令處理器

有時,XML 文件包含處理指令。這些是給處理 XML 的應用程序的特殊指示。我們可以使用 xml_set_processing_instruction_handler() 來處理它們:

<?php
function pi_handler($parser, $target, $data) {
echo "處理指令 - 目標:$target,數據:$data<br>";
}

$parser = xml_parser_create();
xml_set_processing_instruction_handler($parser, "pi_handler");

$xml = "<?xml version='1.0'?><?php echo 'Hello, World!'; ?><root>Some content</root>";
xml_parse($parser, $xml);
xml_parser_free($parser);
?>

這將輸出:

處理指令 - 目標:php,數據:echo 'Hello, World!'

默認處理器

最後,xml_set_default_handler() 讓我們能夠處理其他處理器沒有捕獲的任何 XML 數據:

<?php
function default_handler($parser, $data) {
echo "默認處理器:" . htmlspecialchars($data) . "<br>";
}

$parser = xml_parser_create();
xml_set_default_handler($parser, "default_handler");

$xml = "<?xml version='1.0'?><root>Some content</root>";
xml_parse($parser, $xml);
xml_parser_free($parser);
?>

這將輸出:

默認處理器:<?xml version='1.0'?>
默認處理器:<root>Some content</root>

組合所有內容

現在我們已經看到了每個處理器的具體用法,讓我們把它們組合成一個更完整的例子:

<?php
function start_element($parser, $element_name, $element_attrs) {
echo "開始元素:$element_name<br>";
if (!empty($element_attrs)) {
echo "屬性:";
print_r($element_attrs);
echo "<br>";
}
}

function end_element($parser, $element_name) {
echo "結束元素:$element_name<br>";
}

function char_data($parser, $data) {
if (trim($data) !== '') {
echo "字符數據:" . trim($data) . "<br>";
}
}

function pi_handler($parser, $target, $data) {
echo "處理指令 - 目標:$target,數據:$data<br>";
}

function default_handler($parser, $data) {
$data = trim($data);
if (!empty($data)) {
echo "默認處理器:" . htmlspecialchars($data) . "<br>";
}
}

$parser = xml_parser_create();

xml_set_element_handler($parser, "start_element", "end_element");
xml_set_character_data_handler($parser, "char_data");
xml_set_processing_instruction_handler($parser, "pi_handler");
xml_set_default_handler($parser, "default_handler");

$xml = <<<XML
<?xml version='1.0'?>
<?php echo 'Hello, World!'; ?>
<library>
<book id="1">
<title>PHP for Beginners</title>
<author>John Doe</author>
</book>
<book id="2">
<title>Advanced PHP Techniques</title>
<author>Jane Smith</author>
</book>
</library>
XML;

xml_parse($parser, $xml);
xml_parser_free($parser);
?>

這個綜合例子展示了我們討論過的所有處理器。嘗試運行它並看看你會得到什麼輸出!

結論

恭喜你!你剛剛在 PHP 中邁出了使用 SAX 解析的第一步。記住,熟能生巧,所以不要害怕嘗試不同的 XML 構架,並看看你的解析器如何處理它們。

SAX 解析是你的 PHP 工具包中的一個強大工具,特別是在處理大型 XML 文件時。它讓你可以高效且即時地處理 XML,在某些情況下這會非常有幫助。

繼續編程,持續學習,最重要的是,享受樂趣!在你意識到之前,你將會像一位有經驗的專業人士一樣解析 XML。下次見,快樂編程!


| 處理器函數 | 用途 |
|------------|------|
| xml_set_element_handler() | 處理 XML 元素的開始和結束 |
| xml_set_character_data_handler() | 處理 XML 標籤之間的文本數據 |
| xml_set_processing_instruction_handler() | 處理 XML 處理指令 |
| xml_set_default_handler() | 處理其他處理器沒有捕獲的任何 XML 數據 |

Credits: Image by storyset