0

0

用PHP&XML编制迷你搜索引擎(一)_PHP

php中文网

php中文网

发布时间:2016-06-01 12:35:11

|

958人浏览过

|

来源于php中文网

原创

一、认识XML

大家可能对XML还很陌生我这里不想系统的讲解XML为何许物也我只是对本文用到的一些概念进行一些介绍如果您已经使用过XML哪怕是初学者。您也可以跳过这章。

谈起XML
我不妨先给您一段我们熟悉的html的代码。

(1) html>

(2) title>page title/title>

(3) body>

(4) p>center>font color="red">TEXT/font>/center>/p>

(5) a href="www.yahoo.com">img src="yahoo.gif"/>/a>

(6) /body>

(7) /html>

上面这段代码从结构上就可以符合XML的规则。
他符合下面几个特点

1、引用同一个元素的时候
使用一致的大小写如center>/Center>就是不符合规定的

2、任何属性值
(如 href="????")要用"" 扩起来如a href=www.yahoo.com>就是不正确的

3、所有元素必须由打开
和关闭>标注组成元素应该形如body>/body>、或空元素img ... />

请注意结尾的
/> 少了/就是错误的代码

4、所有元素必须彼此嵌套
就像写程序的循环一样而且所有的元素必须嵌套于根元素之中如上面的代码所有的内容都嵌套于html>/html>之中。

5、元素名称
(即上面的body a p img等)应为字母开头其实最好就是一个英文单词请注意大小写。



怎么样
XML不是太烦吧你可以理解为他是一个很好的包含数据的树形的结构类型。

好了
大家来熟悉一下我们程序中用到的那个XML吧。



links>网络狂飙之谜你搜索引擎采用PHP和XML技术构建

web memo="memo1" url="">name1/web>

sub>电脑网络

web memo="nemo2">name2/web>

sub>程序设计语言

web memo="memo3">name3/web>

sub>PHP

web url="http://www.phpbuilder.com/" memo="[英文]PHP开发资源。">

www.phpbuilder.com/web>

web url="http://www.fokus.gmd.de" memo="[英文]PHP开发手册。 ">

PHP Manual













其实,它的结构相当简单,根元素就是links,sub代表着一个类别,web就是一个网站的信息,其中包含着属性,url代表网站的联接,memo为备注信息,????中包含的为元素的数据在这里就是类别和网站的名称。请注意,他可是符合我上面的规定的。

在第1行加上
(没有会出错)另存为xyz.xml用IE5以上的浏览器打开看看。

怎么样
他的树形的结构一览无余。

那么我们的mini的搜索引擎为什么要使用他呢。第一个原因就是我在奥索网还不能使用mysql
(真惭愧)其次对于小数据量的搜索引擎来说它的数据量很小如果用数据库来做效率未必有多高。最重要的一点是他维护起来相当的简单减少了人力并且不用编写繁琐的数据库的维护的程序例如我们要添加一个类别或者网页只要编辑文本的文件加上一个web>???/web>或是sub>????/sub>就可以了而且如果想把一个类别移动到另一个地方的话我们只要将这一部分的subctrl-x,ctrl-v不就行了树形结构吗

其实
XML的功能我只用到了一点的皮毛以后我会奉献给大家更深入的文章。



二、PHP如何解析XML

本章的内容借鉴自网易虚拟社区我懒得敲了加以修改。

XML解析器的两种基本类型




基于树型的解析器
将XML文档转换成树型结构。这类解析器分析整篇文章同时提供一个API来访问所产生树的每个元素。其通用的标准为DOM文档对象模式。 使用过Javascript可能用过XMLDOM。



基于事件的解析器
将XML文档视为一系列的事件。当一个特殊事件发生时解析器将调用开发者提供的函数来处理。

基于事件的解析器有一个XML文档的数据集中视图
也就是说它集中在XML文档的数据部分而不是其结构。这些解析器从头到尾处理文档并将类似于元素的开始、元素的结尾、特征数据的开始等等事件通过回调callback函数报告

给应用程序。以下是一个
"Hello-World"的XML文档范例



greeting>

Hello World

/greeting>



基于事件的解析器将报告为三个事件




开始元素
greeting

CDATA项的开始
值为Hello World

结束元素
greeting

不像基于树型的解析器
基于事件的解析器不产生描述文档的结构。在CDATA项中基于事件的解析器不会让你得到父元素greeting的信息。

然而
它提供一个更底层的访问这就使得可以更好地利用资源和更快地访问。通过这种方式就没有必要将整个文档放入内存而事实上整个文档甚至可以大于实际内存值。



准备



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





对象 XML解析函数 描述



元素 xml_set_element_handler
() 元素的开始和结束



字符数据 xml_set_character_data_handler
() 字符数据的开始



外部实体 xml_set_external_entity_ref_handler
() 外部实体出现



未解析外部实体 xml_set_unparsed_entity_decl_handler
() 未解析的外部实体

出现



处理指令 xml_set_processing_instruction_handler
() 处理指令的出现



记法声明 xml_set_notation_decl_handler
() 记法声明的出现



默认 xml_set_default_handler
() 其它没有指定处理函数的事件



所有的回调函数必须将解析器的实例作为其第一个参数
此外还有其它参数



更详细的说明可以参见PHP的说明。



下列用来显示 XML 元素结构
(Element Structure)





下面的范例摘自PHP手册范例


他是我们的搜索引擎的基本结构
但是我就不加以注释了因为我们下一章将会介绍。


$file
= "data.xml";

$depth
= array();



function startElement($parser, $name, $attrs)

{

global $depth;

for ($i = 0; $i $depth[$parser]; $i++) {

print " ";

}

print "$name

"
;

$depth
[$parser]++;

}



function endElement($parser, $name, $attrs)

{

global $depth;

$depth
[$parser]--;

}



$xml_parser
= xml_parser_create();

xml_set_element_handler
($xml_parser, "startElement", "endElement");

if (!($fp = fopen($file, "r"))) {

die("could not open XML input");

}

while ($data = fread($fp, 4096)) {

if (!xml_parse($xml_parser, $data, feof($fp))) {

die(sprintf("XML error: %s at line %d",

xml_error_string
(xml_get_error_code($xml_parser)),

xml_get_current_line_number
($xml_parser)));

}

}

xml_parser_free
($xml_parser);

?>

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.02.06

java多线程方法汇总
java多线程方法汇总

本专题整合了java多线程面试题、实现函数、执行并发相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.02.06

1688阿里巴巴货源平台入口与批发采购指南
1688阿里巴巴货源平台入口与批发采购指南

本专题整理了1688阿里巴巴批发进货平台的最新入口地址与在线采购指南,帮助用户快速找到官方网站入口,了解如何进行批发采购、货源选择以及厂家直销等功能,提升采购效率与平台使用体验。

83

2026.02.06

快手网页版入口与电脑端使用指南 快手官方短视频观看入口
快手网页版入口与电脑端使用指南 快手官方短视频观看入口

本专题汇总了快手网页版的最新入口地址和电脑版使用方法,详细提供快手官网直接访问链接、网页端操作教程,以及如何无需下载安装直接观看短视频的方式,帮助用户轻松浏览和观看快手短视频内容。

15

2026.02.06

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

10

2026.02.06

Python 微服务架构与 FastAPI 框架
Python 微服务架构与 FastAPI 框架

本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

5

2026.02.06

JavaScript 异步编程与事件驱动架构
JavaScript 异步编程与事件驱动架构

本专题深入讲解 JavaScript 异步编程与事件驱动架构,涵盖 Promise、async/await、事件循环机制、回调函数、任务队列与微任务队列、以及如何设计高效的异步应用架构。通过多个实际示例,帮助开发者掌握 如何处理复杂异步操作,并利用事件驱动设计模式构建高效、响应式应用。

7

2026.02.06

java连接字符串方法汇总
java连接字符串方法汇总

本专题整合了java连接字符串教程合集,阅读专题下面的文章了解更多详细操作。

25

2026.02.05

java中fail含义
java中fail含义

本专题整合了java中fail的含义、作用相关内容,阅读专题下面的文章了解更多详细内容。

28

2026.02.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
【李炎恢】ThinkPHP8.x 后端框架课程
【李炎恢】ThinkPHP8.x 后端框架课程

共50课时 | 4.6万人学习

光速学会docker容器
光速学会docker容器

共33课时 | 2万人学习

第二十四期_前端开发
第二十四期_前端开发

共161课时 | 4.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号