跳轉到內容

PHP 和 MySQL 程式設計/XML 和 PHP

來自華夏公益教科書

XML(可擴充套件標記語言)用於主流開發。它最初可能是作為一種網路標準的嘗試,但現在甚至在更傳統的應用程式中也被用作文件標準。例如,Sun 在其 StarOffice 和 OpenOffice 套件中採用的開放文件格式是基於 XML 的。

由於它在 IT 行業中廣泛使用,因此我們作為 PHP 開發人員應該知道如何在我們的 PHP 應用程式中使用 XML 檔案。

XML 結構

[編輯 | 編輯原始碼]

由於 XML 文件是可擴充套件的,因此您建立的用於定義資料的標籤沒有限制。以下是一個簡單 XML 文件的示例

<?xml version="1.0"?>
<document>
   <title>Isn't this simple!</title>
   <body>XML is as simple as pie. :-)</body>
</document>

它看起來如此簡單的原因是它確實非常簡單!就像在 HTML 中一樣,元素用尖括號括起來:"<" 和 ">",其中開始元素與結束元素的區別在於沒有前斜槓:"/"。

在 PHP 中建立 XML 解析器

[編輯 | 編輯原始碼]

定義 XML 解析器

[編輯 | 編輯原始碼]

在 PHP 中,您可以使用 xml_parser_create() 函式定義 XML 解析器,如下所示。

<?
$parser = xml_parser_create(ENCODING);
?>

您可以將 $parser 變數視為 XML 文件的解析引擎。請注意,ENCODING 可以是

1. ISO-8859-1(預設)

2. US-ASCII

3. UTF-8

定義元素處理程式

[編輯 | 編輯原始碼]

元素處理程式透過 xml_set_element_handler() 函式定義,如下所示

<?
xml_set_element_handler(XML_PARSER, START_FUNCTION, END_FUNCTION);
?>

xml_set_element_handler() 函式接受三個引數

1. XML_PARSER - 當您呼叫 xml_parser_create() 函式時建立的變數。

2. START_FUNCTION - 解析器遇到開始元素時要呼叫的函式的名稱。

3. END_FUNCTION - 解析器遇到結束元素時要呼叫的函式的名稱。

例如

 <?
 $parser = xml_parser_create();
 xml_set_element_handler($parser, "startElement", "endElement");
 ?>

定義字元處理程式

[編輯 | 編輯原始碼]

字元處理程式透過 set_character_handler() 函式建立,如下所示

<?
xml_set_character_handler(XML_PARSER, CHARACTER_FUNCTION);
?>

set_character_handler() 函式接受兩個引數

1. XML_PARSER - 當您呼叫 xml_parser_create() 函式時建立的變數。

2. CHARACTER_FUNCTION - 解析器遇到字元資料時要呼叫的函式的名稱。

啟動解析器

[編輯 | 編輯原始碼]

為了最終啟動解析器,我們呼叫 xml_parse() 函式,如下所示

<?
xml_parse(XML_PARSER, XML);
?>

xml_parse() 函式接受兩個引數

1. 當您呼叫 xml_parser_create() 函式時建立的變數。

2. 要解析的 XML。

例如

 <?
 $f = fopen ("simple.xml", 'r');
 $data = fread($f, filesize("simple.xml"));
 xml_parse($parser, $data);
 ?>

解析 XML 文件後,建議釋放儲存解析器的記憶體。這可以透過呼叫 xml_parser_free() 函式來完成,如下所示

<?
xml_parser_free(XML_PARSER);
?>
 <?
 # --- Element Functions ---
 
 function startElement($parser, $name, $attributes){
    # ... some code
 }
 
 function endElement ($parser, $name){
    # ... some code
 }
 
 function characterData ($parser, $data){
    # ... some code
 }
 
 function load_data($file){
    $f = fopen ($file, 'r');
    $data = fread($f, filesize($file));
    return $data;
 } 
 
 # --- Main Program Body ---
 $file = "simple.xml";
 $parser = xml_parser_create();
 xml_set_element_handler($parser, "startElement", "endElement");
 xml_set_character_data_handler($parser, "characterData");
 xml_parse ($parser, load_data($file));
 xml_parser_free($parser);
 ?>

解析 XML 文件

[編輯 | 編輯原始碼]

我們已經看到了使用 PHP 成功解析 XML 文件所需的步驟。讓我們花點時間思考一下這些步驟是如何相互關聯的。

當 XML 解析器初始化時,php 將遍歷 XML 檔案。當找到開始標籤時,將呼叫您(程式設計師)建立的預定義函式。當 php 遇到標籤之間的文字和結束標籤時,也會發生同樣的情況。

以下是如何解析 XML 文件的完整示例。此示例是一個 RSS 閱讀器,可用於顯示符合 RSS 1.0 標準的任何 RSS 提要中的新聞文章。

 <html>
 <head>
 <title> Google Articles </title>
 </head>
 <body>
 &lt;h2>Google Articles&lt;/h2>
 &lt;dl>
 <?php 
 
 $insideitem = false;
 $tag = "";
 $title = "";
 $description = "";
 $link = "";
 
 function startElement($parser, $name, $attrs) {
         global $insideitem, $tag, $title, $description, $link; 
         if ($insideitem) {
                 $tag = $name;
         }
         elseif ($name == "ITEM") {
                 $insideitem = true;
         }
 }
 
 function endElement($parser, $name) {
         global $insideitem, $tag, $title, $description, $link;
         if ($name == "ITEM") {
                 printf("&lt;dt>&lt;b><a href='%s'>%s</a>&lt;/b>&lt;/dt>",
                 trim($link),trim($title));
                 printf("&lt;dd>%s&lt;/dd>", trim($description));
                 $title = "";
                 $description = "";
                 $link = "";
                 $insideitem = false;
         }
 }
 
 function characterData($parser, $data) {
        global $insideitem, $tag, $title, $description, $link;
         if ($insideitem) {
                 switch ($tag) {
                         case "TITLE":
                                 $title .= $data;
                                 break;
                         case "DESCRIPTION":
                                 $description .= $data;
                                 break;
                         case "LINK":
                                 $link .= $data;
                                 break;
                 }
         }
 }
 
 $xml_parser = xml_parser_create();
 xml_set_element_handler($xml_parser, "startElement", "endElement");
 xml_set_character_data_handler($xml_parser, "characterData");
 # $fp = fopen("http://www.newsforge.com/index.rss", 'r')
 $fp = fopen("http://news.google.co.za/nwshp?hl=en&tab=wn&q=&output=rss", 'r')
         or die("Error reading RSS data.");
 while ($data = fread($fp, 4096)) {
         xml_parse($xml_parser, $data, feof($fp))
        or die(sprintf("XML error: %s at line %d",
        xml_error_string(xml_get_error_code($xml_parser)),
         xml_get_current_line_number($xml_parser)));
 }
 fclose($fp);
 xml_parser_free($xml_parser);
 ?>
 &lt;/dl>
 </body>
 </html>

將資料庫內容轉儲到 XML 檔案中

[編輯 | 編輯原始碼]


華夏公益教科書