用PHP&XML编制迷你搜索引擎(一)
作者:520谢鹏 | 来源:互联网 | 2014-07-17 11:58
一、认识XML大家可能对XML还很陌生,我这里不想系统的讲解XML为何许物也,我只是对本文用到的一些概念进行一些介绍,如果您已经使用过XML,哪怕是初学者。您也可以跳过这章。谈起XML,我不妨先给您一段我们熟悉的html的代码。(1)html(2)titlepage
一、认识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>就可以了,而且,如果想把一个类别移动到另一个地方的话,我们只要将这一部分的sub,ctrl-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);
?>
推荐阅读
-
本文介绍了如何利用JavaScript或jQuery来判断网页中的文本框是否处于焦点状态,以及如何检测鼠标是否悬停在指定的HTML元素上。 ...
[详细]
蜡笔小新 2024-12-27 21:33:33
-
1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ...
[详细]
蜡笔小新 2024-12-27 19:32:17
-
-
本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ...
[详细]
蜡笔小新 2024-12-27 19:05:41
-
本文详细探讨了当使用PHP连接MySQL数据库时遇到500内部服务器错误的多种解决方案,提供了详尽的操作步骤和专业建议。无论是初学者还是有经验的开发者,都能从中受益。 ...
[详细]
蜡笔小新 2024-12-27 15:48:52
-
本文介绍如何仅使用Numpy库,通过双线性插值方法实现图像的高效缩放,避免了对OpenCV等图像处理库的依赖。文中详细解释了算法原理,并提供了完整的代码示例。 ...
[详细]
蜡笔小新 2024-12-28 13:15:40
-
本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ...
[详细]
蜡笔小新 2024-12-28 12:22:34
-
本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ...
[详细]
蜡笔小新 2024-12-28 12:07:46
-
2023 ARM嵌入式系统全国技术巡讲旨在分享ARM公司在半导体知识产权(IP)领域的最新进展。作为全球领先的IP提供商,ARM在嵌入式处理器市场占据主导地位,其产品广泛应用于90%以上的嵌入式设备中。此次巡讲将邀请来自ARM、飞思卡尔以及华清远见教育集团的行业专家,共同探讨当前嵌入式系统的前沿技术和应用。 ...
[详细]
蜡笔小新 2024-12-28 11:58:48
-
探讨一个老旧 PHP MySQL 系统中,时间戳字段不定期出现异常值的问题及其可能原因。 ...
[详细]
蜡笔小新 2024-12-28 11:46:54
-
尽管商业智能(BI)工具在中国的普及程度尚不及国际市场,但近年来,随着本土企业的持续创新和市场推广,国内主流BI工具正逐渐崭露头角。面对国际品牌如Tableau的强大竞争,国内BI工具通过不断优化产品和技术,赢得了越来越多用户的认可。 ...
[详细]
蜡笔小新 2024-12-28 11:12:44
-
本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ...
[详细]
蜡笔小新 2024-12-28 10:36:30
-
本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ...
[详细]
蜡笔小新 2024-12-27 20:40:29
-
本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ...
[详细]
蜡笔小新 2024-12-27 17:40:42
-
本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ...
[详细]
蜡笔小新 2024-12-27 17:31:41
-
本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ...
[详细]
蜡笔小新 2024-12-27 16:20:10
-