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>
本节为残缺章节。 您可以通过 扩展它 来帮助维基教科书。 |