专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »PHP教程 » phpxml:PHP中的XML应用 »正文

phpxml:PHP中的XML应用

来源: 发布时间:星期四, 2009年2月12日 浏览:116次 评论:0


综述

XML代表Extensible Markup Language(eXtensible Markup Language缩写意为可扩展标记语言)XML是套定义语义标记规则这些标记将文档分成许多部件并对这些部件加以标识它也是元标记语言即定义了用于定义其他和特定领域有关、语义、结构化标记语言句法语言XML是当今最热门技术而PHP也具有分析XML文档功能,下面我们将共同探讨下PHP中XML应用情况

XML概貌

  谈起XML(eXtended Markup Language:可扩展标记语言)我们不妨先看段HTML代码:

<html>
<title>XML</title>
<body>
<p><center><font color=\"red\">TEXT</font></center></p>
<a href=\"www.do.com\"><img src=\"logo.jpg\"/>
</body>
</html>
  上面这段代码从结构上就符合XML规则XML可以理解是包含数据树形结构类型:

1、引用同个元素时候使用大小写如<center></Center>就是不符合规定
2、任何属性值(如 href=\"????\")要用\"\"引起来如<a href=www.yahoo.com>就是不正确
3、所有元素必须由打开<和关闭>标注组成元素应该形如<body></body>或空元素<img ... />如果结尾 \"/>\" 少了\"/\"就是代码
4、所有元素必须彼此嵌套就像写循环而且所有元素必须嵌套于根元素的中比如上面代码所有内容都嵌套于<html></html>的中
5、元素名称(即上面body a p img等)应为字母开头

怎样应用PHPXML解析器Expat?

Expat是PHP脚本语言XML解析器(同样称为XML处理器)可以使访问XML文档结构和内容它是种基于事件解析器XML解析器有两种基本类型:

基于树型解析器:将XML文档转换成树型结构这类解析器分析整篇文章同时提供个API来访问所产生树每个元素其通用标准为DOM(文档对象模式)

基于事件解析器:将XML文档视为系列事件个特殊事件发生时解析器将开发者提供来处理基于事件解析器有个XML文档数据集中视图也就是说它集中在XML文档数据部分而不是其结构这些解析器从头到尾处理文档并将类似于-元素开始、元素结尾、特征数据开始等等-事件通过回调(callback)报告给应用

以下是个\"Hello-World\"XML文档范例:

<greeting>
Hello World
</greeting>
  基于事件解析器将报告为 3个事件:

开始元素:greeting
CDATA项开始值为:Hello World
结束元素:greeting

  基于事件解析器不产生描述文档结构当然如果使用Expat必要时它样可以在PHP中生成完全原生树结构在CDATA项中基于事件解析器不会得到父元素greeting信息然而它提供个更底层访问这就使得可以更好地利用资源和更快地访问通过这种方式就没有必要将整个文档放入内存;而事实上整个文档甚至可以大于实际内存值

  上面Hello-World范例虽然包括完整XML格式但它是无效既没有DTD(文档类型定义)和其联系也没有内嵌DTD但是Expat是个不检查有效性解析器因此忽略任何和文档联系DTD应注意是文档仍然需要完整格式否则Expat(和其他符合XML标准解析器样)将会随着出错信息而停止

编译Expat

  Expat可以编译进PHP3.0.6版本(或以上)中从Apache1.3.22开始Expat已经作为Apache部分在Unix系统中可以通过-with-xml选项配置PHP将其编译入PHP

  如果将PHP编译为Apache模块而Expat将默认作为Apache部分在Windows中则必须要加载XML动态连接库

  XML范例:XMLstats
  我们所要讨论范例是使用Expat来收集XML文档统计数据

  对于文档中每个元素以下信息都将被输出:
  • 该元素在文档中使用次数
  • 该元素中数据数量
  • 元素父元素
  • 元素子元素
  注意:为了演示我们利用PHP来产生个结构来保存元素父元素和子元素
用于产生XML解析器例子有哪些?

  用于产生XML解析器例子为xml_parser_create该例子将用于以后所有这个思路非常类似于PHP中MySQL连接标记在解析文档前基于事件解析器通常要求注册回调-用于特定事件发生时Expat没有例外事件它定义了如下 7个可能事件:





对象XML解析描述元素xml__element_handler元素开始和结束数据xml__character_data_handler数据开始外部实体xml__external_entity_ref_handler外部实体出现 未解析外部实体xml__unparsed_entity_decl_handler未解析外部实体出现处理指令xml__processing_instruction_handler处理指令出现记法声明xml__notation_decl_handler记法声明出现默认xml__default_handler其它没有指定处理事件
所有回调必须将解析器例子作为其第个参数(此外还有其它参数)

  对于本文最后范例脚本需要注意是它既用到了元素处理又用到了数据处理元素回调处理通过xml__element_handler来注册

这个需要 3个参数:

解析器例子
处理开始元素回调名称
处理结束元素回调名称

  当开始解析XML文档时回调必须存在它们必须定义为和PHP手册中所描述原型

  例如Expat将 3个参数传递给开始元素处理在脚本范例中其定义如下:

function start_element($parser, $name, $attrs)

$parser是解析器标志$name是开始元素名称$attrs为包含元素所有属性和值

旦开始解析XML文档Expat在遇到开始元素是都将start_element并将参数传递过去



  XMLCase Folding选项

  用xml_parser__option将Case folding选项关闭这个选项默认是打开使得传递给处理元素名自动转换为大写但XML对大小写是敏感(所以大小写对统计XML文档是非常重要)对于我们范例 folding选项必须关闭
如何对文档进行解析?

  在完成所有准备工作后现在脚本终于可以解析XML文档:

Xml_parse_from_file个自定义打开参数中指定文件并以4kb大小进行解析
xml_parse和xml_parse_from_file当发生即XML文档格式不完全时将会返回false

  我们可以使用xml_get_error_code来得到最后数字代码将此数字代码传递给xml_error_即可得到文本信息输出XML当前行数使得调试更容易

  当解析文档时对于Expat需要强调问题是:如何保持文档结构基本描述?

  如前所述基于事件解析器本身并不产生任何结构信息不过标签(tag)结构是XML重要特性例如元素序列<book><title>表示意思区别于<figure><title>书名和图名是没有关系虽然它们都用到\"title\"这个术语因此为了更有效地使用基于事件解析器处理XML必须使用自己栈(stacks)或列表(lists)来维护文档结构信息

  为了产生文档结构镜像脚本至少需要知道目前元素父元素用ExaptAPI是无法实现它只报告目前元素事件而没有任何前后关系信息因此需要建立自己栈结构

  脚本范例使用先进后出(FILO)栈结构通过栈将保存全部开始元素对于开始元素处理目前元素将被.gif' />_push推到栈顶部相应结束元素处理通过.gif' />_pop将最顶元素移走

  对于序列<book><title></title></book>填充如下:

开始元素book:将\"book\"赋给栈个元素($stack[0])
开始元素title:将\"title\"赋给栈顶部($stack[1])
结束元素title:从栈中将最顶部元素移去($stack[1])
结束元素title:从栈中将最顶部元素移去($stack[0])

  PHP3.0通过个$depth变量手动控制元素嵌套来实现范例这就使脚本看起来比较复杂PHP4.0通过.gif' />_pop.gif' />_push两个来使脚本看起来更简洁

如何收集XML文档中元素信息?

  为了收集每个元素信息脚本需要记住每个元素事件通过使用个全局变量$elements来保存文档中所有区别元素项目是元素类例子有4个属性(类变量)

$count -该元素在文档中被发现次数
$chars -元素中事件字节数
$parents -父元素
$childs - 子元素

  注意:PHP个特性是你可以通过while(list = each)loop遍历整个类结构如同你遍历整个相应所有类变量(当你用PHP3.0时还有思路方法名)都以方式输出

  当发现个元素时我们需要增加其相应记数器来跟踪它在文档中出现多少次在相应$elements项中记数元素也要加

  我们同样要让父元素知道目前元素是它子元素因此目前元素名称将会加入到父元素$childs项目中最后目前元素应该记住谁是它父元素所以父元素被加入到目前元素$parents项目中

显示统计信息

  剩下代码在$elements和其子中循环显示其统计结果这就是最简单嵌套循环尽管输出正确结果但代码既不简洁又没有任何特别窍门技巧它仅仅是个你可能每天用他来完成工作循环
脚本范例被设计为通过PHPCGI方式命令行来因此统计结果输出格式为文本格式如果你要将脚本运用到互联网上那么你需要修改输出来产生HTML格式

如何用PHP&XML编制个迷你搜索引擎例子?

  让我们首先来熟悉下我们中用到那个XML(保存为xyz.xml)

<?xml version=\"1.0\" encoding=\"gb2312\" ?>
<links>采用PHP和XML技术构建搜索引擎
<web memo=\"memo1\" url=\"\">name1</

[1][2]下

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: