如今人人鼓吹XML是Web开发者最好的朋友,有了XML的帮忙,后者即可轻松地格式化和显示来自几乎任何数据源的数据。但是,对动态内容而言,格式优良的数据却还远远谈不上达到理想状态。大多数的Web开发者都会告诉你,今天的网络上没有动态内容怎么能行!问题是:“到底该如何用XML创建动态内容呢?”
答案是用动态内容处理语言来解析XML,比如用PHP或者Perl等,从理论上说,这类程序语言是可以出于各种目的利用XML的。无非是采用一些能解析XML的工具包而已。James Clark就提供了一种名叫expat的工具包。expat XML工具包用C语言解析XML,令PHP与XML轻松共舞。
PHP是一种专为Web设计的绝佳脚本语言。XML是表示Web内容的标准。两者联手真是要多美有多美!
下面我会给读者演示一个简单的示例,通过这个例子即可说明如何用PHP把XML文档解析为HTML。然后我会介绍一些PHP的其他XML概念。用PHP解析XML很简单,操作起来很直观但却需要对细节有所解释。一旦真正掌握了应用的要领,你肯定会惊奇自己怎么不早想到把它们俩拢一块儿来。
概述
相关附件:程序清单A 所示为脚本的完整代码,脚本要解析的XML文档则是 相关附件:程序清单B。处理之后的输出结果如表A所示。
表A PHP解析XML的输出结果
首先我创建了XML解析器的一个实例: $parser = xml_parser_create();
接着,我定义解析器遭遇开始和结束标签时的操作。注意“startElement”和“endElement”是用户定义的函数,当然你可以按照自己的喜好给它们起个其他名字,但我起的这些名字可是标准的习惯要求。 xml_set_element_handler($parser, “startElement”, “endElement”);
然后我定义了数据操作。这里的“characterData”也是用户定义的函数,名字也是习惯性的。 xml_set_character_data_handler($parser, “characterData”);
现在打开文件读取数据。你可以在这里开始编写错误处理代码,我在例子中省略了这些错误处理。不要忘了在脚本的开头定义$xml_file。 $filehandler = fopen($xml_file, “r”);
我开始读取文件内容,一次读4K字节并放在变量“$data”内直到文件末尾。我用xml_parse解析读取的这些数据段。 while ($data = fread($filehandler, 4096)) { xml_parse($parser, $data, feof($filehandler)); }
最后进行清空、关闭文件和释放解析器等操作。 fclose($filehandler); xml_parser_free($parser);
以上就是脚本中所用到的所有XML函数,下面我再具体解释下其中用到的3个用户定义函数,它们就是“startElement”、“endElement”和“characterData”。
只要xml_parse遇到<url>这样的开始标签,“startElement”函数就由XML解析器调用,在我们的例子中解析器就是$parser。该函数是必须定义的函数,它拥有3个自动传递给它的参数:XML解析器实例、大写的元素名称,比如URL以及该元素所具有的属性数组。在以上示例中,XML文件中的元素没有属性集合,所以数组参数为空,但这个参数还是必须存在的。
就这个例子而言,我决定在一个HTML表中显示我的XML数据。如上所示,出于简化的缘故我没有编写错误处理代码。这里我耍了个障眼法,因为我知道XML文件中标签出现的顺序。否则我可以用“startElement”、“characterData”和“endElement”函数来定义数组,然后用单独的函数显示结果。
function startElement($parser_instance, $element_name, $attrs) { switch($element_name) { case “URL” : echo “<tr><td><a href=””; break; case “SUMMARY” : echo “<td>”; break; } }
处理元素标签之后,xml_parse一旦遇到XML数据就会调用“characterData”函数。这个函数也是由解析器自动调用的,该函数需要两个参数,解析器实例和包含数据的字符串。 function characterData($parser_instance, $xml_data) { echo $xml_data; }
最后xml_parse遭遇结束标签,运行“endElement”函数,该函数带两个参数,解析器实例和元素名称。
function endElement($parser_instance, $element_name) { switch($element_name) { case “URL” : echo “”>”; break; case “TITLE” : echo “</a></td>”; break; case “SUMMARY” : echo “</td></tr>”; break; } }
用PHP解析XML的轻量锻炼到这里就结束了,下面我们开始加些重活。
增加函数
PHP中还有其他一些同XML解析有关的函数。PHP.net文档对这些函数进行了完整的说明。我在这里提到了一些,你或许不久就会用到这些函数:
如果你觉得自己已经上手,我建议你仔细读读PHP手册页中提供的XML External Entity Example。这些例子提出了本文没有提到的其他一些概念以及处理文件错误的某些技术。
小结
本文演示了PHP和XML的紧密结合过程。两种技术以Web为中心的天性促使它们联合起来成为动态内容所需的理想解决方案。
|