跳转到内容

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 文件中

[编辑 | 编辑源代码]


华夏公益教科书