热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用PHP工具包expat解析XML

如今人人鼓吹xml是web开发者最好的朋友,有了xml的帮忙,后者即可轻松地格式化和显示来自几乎任何数据源的数据。但是,对动态内容而言,格式优良的数据却还远远谈不上达到理想状态。大多数的web开发者都会告诉你,今天的网络上没有动态内容怎么能行!问题是:到底该如
如今人人鼓吹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 three-part series, i'll 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 xml's attendant technologies, data type definition (dtd).

"remedial xml: using xml schema" in this article, we'll 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 it's time to put on your programmer's hat and get acquainted with document object model (dom), which provides easy access to xml documents via a tree-like set of objects.

"remedial xml: learning to play sax" in this fifth installment in our remedial xml series, i'll introduce you to the sax api and provide some links to sax implementations in several languages.

表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遇到这样的开始标签,“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 “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解析有关的函数。php.net文档对这些函数进行了完整的说明。我在这里提到了一些,你或许不久就会用到这些函数:

xml_set_default_handler()—该函数的工作方式和xml_set_character_data_handler()函数相近,但它捕获定义的一切。这个函数常用于文档类型声明控制数据的处理。
xml_parser_set_option()—你可以用这个函数禁用字母的转大写操作或者选择其他替代的字符编码集。
xml_parse_into_struct()—这个函数用来略过“startelement”、“characterdata”和“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为中心的天性促使它们联合起来成为动态内容所需的理想解决方案。

推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • PHP组合工具以及开发所需的工具
    本文介绍了PHP开发中常用的组合工具和开发所需的工具。对于数据分析软件,包括Excel、hihidata、SPSS、SAS、MARLAB、Eview以及各种BI与报表工具等。同时还介绍了PHP开发所需的PHP MySQL Apache集成环境,包括推荐的AppServ等版本。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 说到C语言的语句块,真是一堆血泪史。第一大坑就是优先级。刚工作那会儿,C的书没看几本,自信满满的认为C语言都会了,拿出搞ACM培养的豪情壮志,代码倒是写得爽,却到处留 ... [详细]
  • 有关phpfgetss()函数的文章推荐10篇
    有关phpfgetss()函数的文章推荐10篇:了解如何使用PHP的各种文件函数。查看诸如fopen、fclose和feof之类的基本文件函数;了解诸如fgets、fgetss和f ... [详细]
author-avatar
louis_bana
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有