PHP 和 MySQL 程式設計/XML 和 PHP
XML(可擴充套件標記語言)用於主流開發。它最初可能是作為一種網路標準的嘗試,但現在甚至在更傳統的應用程式中也被用作文件標準。例如,Sun 在其 StarOffice 和 OpenOffice 套件中採用的開放文件格式是基於 XML 的。
由於它在 IT 行業中廣泛使用,因此我們作為 PHP 開發人員應該知道如何在我們的 PHP 應用程式中使用 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_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);
?>
我們已經看到了使用 PHP 成功解析 XML 文件所需的步驟。讓我們花點時間思考一下這些步驟是如何相互關聯的。
當 XML 解析器初始化時,php 將遍歷 XML 檔案。當找到開始標籤時,將呼叫您(程式設計師)建立的預定義函式。當 php 遇到標籤之間的文字和結束標籤時,也會發生同樣的情況。
以下是如何解析 XML 文件的完整示例。此示例是一個 RSS 閱讀器,可用於顯示符合 RSS 1.0 標準的任何 RSS 提要中的新聞文章。
<html>
<head>
<title> Google Articles </title>
</head>
<body>
<h2>Google Articles</h2>
<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("<dt><b><a href='%s'>%s</a></b></dt>",
trim($link),trim($title));
printf("<dd>%s</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);
?>
</dl>
</body>
</html>
| 本節為殘缺章節。 您可以透過 擴充套件它 來幫助華夏公益教科書。 |