如今人人鼓吹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很简单操作起来很直观但却需要对细节有所解释一旦真正掌握了应用的要领你肯定会惊奇自己怎么不早想到把它们俩拢一块儿来
概述
PHP用expat这种XML工具包通过C语言来解析XML这个工具包的函数集同Perl XML解析所采用的函数集是一样的此外这种工具包还是事件驱动型的解析器这就是说expat把每个XML标签或者新一行代码当作事件的起始而事件就是函数的触发器Expat的安装非常简单如果你正在用着Apache Web服务器那么你可以在PHP XML参考页上找到安装和下载指南
用PHP解析XML的基本任务是这样的首先创建XML解析器的一个实例接着定义处理触发事件的函数比如开始或者结束标签等随后定义实际意义的数据处理程序最后打开XML文件读取文件数据并解析数据之后关闭文件释放XML解析器
你瞧就像我说的那样这套操作过程没什么特别的不过在我们讨论具体的示例之前先了解以下的一些警示
Expat不对XML进行检验这意味着只要XML文件格式正确——所有的元素嵌套得当开始和关闭标签没有任何错误——它就会被解析Expat可不管XML是否遵守XML文件头中引用的标准或者定义
Expat把XML标签全部转换为大写字母如果你的脚本在标签名和其他内容上大小写字母混用可就要小心了
PHP是在magic quotes设置启用的情况下编译而成那么复杂的XML文件不会得到正确的解析要是magic quotes不是默认设置你就当我没说
好了我们现在就来看看有关的示例!
基本示例
为了把复杂的事情简单化我在例子中省略了错误检查和其他一些不必要的东西当然你可以在自己的代码随心所欲我假定你早就熟悉PHP及其语法而我会对XML函数做一番解释首先我会说明脚本程序的含义接着定义用户定义函数实际上这些函数位于引用它们的代码之前相关附件:程序清单A 所示为脚本的完整代码脚本要解析的XML文档则是 相关附件:程序清单B处理之后的输出结果如表A所示
XML Articles
Remedial XML for programmers: Basic syntax In this first installment in a threepart series Ill introduce you to XML and its basic syntax
Remedial XML: Enforcing document formats with DTDs To enforce structure requirements for an XML document you have to turn to one of XMLs attendant technologies data type definition (DTD)
Remedial XML: Using XML Schema In this article well briefly touch on the shortcomings of DTDs and discuss the basics of a newer more powerful standard: XML Schemas
Remedial XML: Say hello to DOM Now its time to put on your programmers hat and get acquainted with Document Object Model (DOM) which provides easy access to XML documents via a treelike set of objects
Remedial XML: Learning to play SAX In this fifth installment in our Remedial XML series Ill introduce you to the SAX API and provide some links to SAX implementations in several languages
表APHP解析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);
我开始读取文件内容一次读K字节并放在变量$data内直到文件末尾我用xml_parse解析读取的这些数据段
while ($data = fread($filehandler )) {
xml_parse($parser $data feof($filehandler));
}
最后进行清空关闭文件和释放解析器等操作
fclose($filehandler);
xml_parser_free($parser);
以上就是脚本中所用到的所有XML函数下面我再具体解释下其中用到的个用户定义函数它们就是startElementendElement和characterData
只要xml_parse遇到这样的开始标签startElement函数就由XML解析器调用在我们的例子中解析器就是$parser该函数是必须定义的函数它拥有个自动传递给它的参数XML解析器实例大写的元素名称比如URL以及该元素所具有的属性数组在以上示例中XML文件中的元素没有属性集合所以数组参数为空但这个参数还是必须存在的
就这个例子而言我决定在一个HTML表中显示我的XML数据如上所示出于简化的缘故我没有编写错误处理代码这里我耍了个障眼法因为我知道XML文件中标签出现的顺序否则我可以用startElementcharacterData和endElement函数来定义数组然后用单独的函数显示结果
function startElement($parser_instance $element_name $attrs) {
switch($element_name) {
case URL : echo break;
case SUMMARY : echo ;
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 ;
break;
case SUMMARY : echo ;
break;
}
}
用PHP解析XML的轻量锻炼到这里就结束了下面我们开始加些重活
增加函数
PHP中还有其他一些同XML解析有关的函数文档对这些函数进行了完整的说明我在这里提到了一些你或许不久就会用到这些函数
xml_set_default_handler()—该函数的工作方式和xml_set_character_data_handler()函数相近但它捕获定义的一切这个函数常用于文档类型声明控制数据的处理
xml_parser_set_option()—你可以用这个函数禁用字母的转大写操作或者选择其他替代的字符编码集
xml_parse_into_struct()—这个函数用来略过startElementcharacterData和endElement函数的调用而把数据直接放进数组
xml_error_string()—这个函数用来从xml_parser() 错误中获取文本信息
xml_get_error_code()—你可以用这个函数获取上面提到的错误字符串
后两个函数的用法是这样的if(!xml_parse($parser $data feof($filehandler))) { die(xml_error_string(xml_get_error_code($parser)); )
如果你觉得自己已经上手我建议你仔细读读PHP手册页中提供的XML External Entity Example这些例子提出了本文没有提到的其他一些概念以及处理文件错误的某些技术
小结
本文演示了PHP和XML的紧密结合过程两种技术以Web为中心的天性促使它们联合起来成为动态内容所需的理想解决方案