仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1218|回复: 18
打印 上一主题 下一主题

[学习教程] PHP编程:若何用PHP把RDF内容拔出Web站点当中(二...

[复制链接]
只想知道 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-4 00:27:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
培训的第三阶段,开始接触MYSQL,设计数据库,学习PHP如何去连接MYSQL数据库。对于MYSQL,我并不陌生,因为学校开设了Linux系统的课程,对于数据库的操作。web|拔出|站点   既然从手艺上讲,RSS是布局优秀的XML文档,所以可以用尺度的XML编程手艺来处置它。次要有两种手艺:SAX(the Simple API for XML)和DOM(the Document Object Model)。

SAX剖析器任务时遍历全部XML文档,在碰到不必类型的标志时挪用特定的函数。好比,挪用特定函数处置一个入手下手标志,挪用另外一个函数处置一个停止标志,再挪用一个函数处置二者之间的数据。剖析器的职责仅仅是按次遍历这个文档。而它所挪用的函数担任处置发明的标志。一旦一个标志被处置终了,剖析器持续剖析文档中的下一个元素,这一进程不休反复。

另外一方面,DOM剖析器任务是把全部XML文档读进内存傍边,并将之转换成一种分层的树型布局。并且为会见分歧的树结点(和结点所附的内容)供应了API。递归处置体例加上API函数使得开辟者可以辨别分歧类型的结点(元素,属性,字符数据,正文等),同时依据文档树的结点类型和结点深度,使得履行分歧的举措成为能够。

SAX和DOM剖析器几近撑持每种言语,包含你我的最爱――PHP。我将在这篇文章中使用PHP的SAX剖析器处置RDF的例子。 固然,利用DOM剖析器也一样很轻易。

让咱们看这个复杂的例子,把它记在脑海里。上面是一个我将要利用的RDF文件,这个文件直接选自http://www.freshmeat.net/ :

<?xml version="1.0" encoding="ISO-8859-1"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://purl.org/rss/1.0/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
>
<channel rdf:about="http://freshmeat.net/">
<title>freshmeat.net</title>
<link>http://freshmeat.net/</link>
<description>freshmeat.net maintains the Web's largest index of Unix
and cross-platform open source software. Thousands of applications are
meticulously cataloged in the freshmeat.net database, and links to new
code are added daily.</description>
<dc:language>en-us</dc:language>
<dc:subject>Technology</dc:subject>
<dc:publisher>freshmeat.net</dc:publisher>
<dc:creator>freshmeat.net contributors</dc:creator>
<dc:rights>Copyright (c) 1997-2002 OSDN</dc:rights>
<dc:date>2002-02-11T10:20+00:00</dc:date>
<items>
<rdf:Seq>
<rdf:li rdf:resource="http://freshmeat.net/releases/69583/" />
<rdf:li rdf:resource="http://freshmeat.net/releases/69581/" />

<!-- and so on -->

</rdf:Seq>
</items>
<image rdf:resource="http://freshmeat.net/img/fmII-button.gif" />
<textinput rdf:resource="http://freshmeat.net/search/" />
</channel>

<image rdf:about="http://freshmeat.net/img/fmII-button.gif">
<title>freshmeat.net</title>
<url>http://freshmeat.net/img/fmII-button.gif</url>
<link>http://freshmeat.net/</link>
</image>

<item rdf:about="http://freshmeat.net/releases/69583/">
<title>sloop.splitter 0.2.1</title>
<link>http://freshmeat.net/releases/69583/</link>
<description>A real time sound effects program.</description>
<dc:date>2002-02-11T04:52-06:00</dc:date>
</item>

<item rdf:about="http://freshmeat.net/releases/69581/">
<title>apacompile 1.9.9</title>
<link>http://freshmeat.net/releases/69581/</link>
<description>A full-featured Apache compilation HOWTO.</description>
<dc:date>2002-02-11T04:52-06:00</dc:date>
</item>

<!-- and so on -->

</rdf:RDF>


上面是剖析这一文档并显示个中数据的PHP剧本:

<?php
// XML file
$file = "fm-releases.rdf";

// set up some variables for use by the parser
$currentTag = "";
$flag = "";

// create parser
$xp = xml_parser_create();

// set element handler
xml_set_element_handler($xp, "elementBegin", "elementEnd");
xml_set_character_data_handler($xp, "characterData");
xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING, TRUE);

// read XML file
if (!($fp = fopen($file, "r")))
{
die("Could not read $file");
}

// parse data
while ($xml = fread($fp, 4096))
{
if (!xml_parse($xp, $xml, feof($fp)))
{
die("XML parser error: " .
xml_error_string(xml_get_error_code($xp)));
}
}

// destroy parser
xml_parser_free($xp);

// opening tag handler
function elementBegin($parser, $name, $attributes)
{
global $currentTag, $flag;
// export the name of the current tag to the global scope
$currentTag = $name;
// if within an item block, set a flag
if ($name == "ITEM")
{
$flag = 1;
}
}

// closing tag handler
function elementEnd($parser, $name)
{
global $currentTag, $flag;
$currentTag = "";
// if exiting an item block, print a line and reset the flag
if ($name == "ITEM")
{
echo "<hr>";
$flag = 0;
}
}

// character data handler
function characterData($parser, $data)
{
global $currentTag, $flag;
// if within an item block, print item data
if (($currentTag == "TITLE" || $currentTag == "LINK" ||
$currentTag ==
"DESCRIPTION") && $flag == 1)
{
echo "$currentTag: $data <br>";
}
}

?>
看不分明? 别焦急,前面将会作出注释。



捕捉旗标

这段剧本起首要做的是设定一些全局变量:

// XML file
$file = "fm-releases.rdf";

// set up some variables for use by the parser
$currentTag = "";
$flag = "";

$currentTag变量保留是剖析器以后处置的元素的称号――你很快就会看到为何需求它。

由于我的终究目标是显示频道中的每个独自的条目(item),而且带有链结。别的还要晓得剖析器甚么时分加入了<channel></channel>区块,甚么时分又进入了文档的 <item></item>局部。再说我用的是SAX剖析器,它按按次体例任务,没有任何剖析器API可供利用,没法晓得文档树中的深度和地位。所以,我不能不本人创造一个机制来做这件事――这就是引入$flag变量的缘由。

$flag变量将用于判别剖析器是在<channel>区块仍是在<item>区块外面。

下一步要做的是初始化SAX剖析器,并入手下手剖析RSS文档。

// create parser
$xp = xml_parser_create();

// set element handler
xml_set_element_handler($xp, "elementBegin", "elementEnd");
xml_set_character_data_handler($xp, "characterData");
xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING, TRUE);

// read XML file
if (!($fp = fopen($file, "r")))
{
die("Could not read $file");
}

// parse data
while ($xml = fread($fp, 4096))
{
if (!xml_parse($xp, $xml, feof($fp)))
{
die("XML parser error: " .
xml_error_string(xml_get_error_code($xp)));
}
}

// destroy parser
xml_parser_free($xp);


这段代码复杂了然,个中的正文已注释的足够清晰了。xml_parser_create()函数创立一个剖析器实例,并将之赋给句柄$xp。接着再创立回调函数处置开标志和闭标志,和两者之间的字符数据。最初,xml_parse()函数结合屡次fread()挪用,读取RDF文件并剖析它。

在文档中,每次碰到开标志,开标志处置器elementBegin()就会被挪用。

// opening tag handler
function elementBegin($parser, $name, $attributes)
{
global $currentTag, $flag;
// export the name of the current tag to the global scope
$currentTag = $name;
// if within an item block, set a flag
if ($name == "ITEM")
{
$flag = 1;
}
}



这个函数以以后标志的称号和属性作为起参数。标志称号被赋值给全局变量$currentTag。假如,这个开标志是<item>,那末把$flag变量置1。

一样,假如碰到闭标志,那末闭标志处置器elementEnd()将被挪用。

// closing tag handler
function elementEnd($parser, $name)
{
global $currentTag, $flag;
$currentTag = "";
// if exiting an item block, print a line and reset the flag
if ($name == "ITEM")
{
echo "<hr>";
$flag = 0;
}
}
闭标志处置函数也是以标志称号作为其参数。假如是碰到的是一个为</item>的闭标志,变量$flag的值重置为0,并把变量$currentTag的值清空。

那末,若何处置标志之间的字符数据呢? 这才是咱们的乐趣地点。先向字符数据处置器characterData()打个召唤吧。

// character data handler
function characterData($parser, $data)
{
global $currentTag, $flag;
// if within an item block, print item data
if (($currentTag == "TITLE" || $currentTag == "LINK" ||
$currentTag ==
"DESCRIPTION") && $flag == 1)
{
echo "$currentTag: $data <br>";
}
}


如今你可以看一下传给这个函数的参数,你会发明它只吸收了开标志和闭标志之间的数据,而基本不晓得剖析器以后正在处置哪一个标志。而这闲事咱们一入手下手就引入全局变量$currentTag的缘由。

假如$flag变量的值为1,也就是说假如剖析器以后处于<item></itme>区块之间,那末以后被处置的元素,不论是<title>,<link>仍是<description>,数据都被打印到输入装备上(在这里,输入装备是Web阅读器),并在每一个元素的输入前面加上换行符<br>。

全部RDF文档就是以这类按次体例处置,每发明一个<item>标志就显示必定的输入。你可以看一下上面的运转了局:

  只要实现最基本的功能就可以了 就是可以添加留言 然后可以显示留言,然后加入管理功能
若天明 该用户已被删除
沙发
发表于 2015-2-17 17:13:37 | 只看该作者
首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。
小魔女 该用户已被删除
板凳
发表于 2015-3-3 19:24:34 | 只看该作者
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
谁可相欹 该用户已被删除
地板
发表于 2015-3-7 09:08:22 | 只看该作者
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
再见西城 该用户已被删除
5#
发表于 2015-3-10 19:16:39 | 只看该作者
你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。
分手快乐 该用户已被删除
6#
发表于 2015-3-16 02:43:46 | 只看该作者
其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎
海妖 该用户已被删除
7#
发表于 2015-3-17 09:11:25 | 只看该作者
当然这种网站的会员费就几十块钱。
不帅 该用户已被删除
8#
发表于 2015-3-24 05:40:25 | 只看该作者
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
若相依 该用户已被删除
9#
发表于 2015-4-5 17:54:35 | 只看该作者
刚开始安装php的时候,我图了个省事,把php的扩展全都打开啦(就是把php.ini 那一片 extension 前面的冒号全去掉啦),这样自然有好处,以后不用再需要什么功能再来打开。
admin 该用户已被删除
10#
发表于 2015-4-14 19:28:28 | 只看该作者
写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。
第二个灵魂 该用户已被删除
11#
发表于 2015-4-16 16:47:01 | 只看该作者
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
金色的骷髅 该用户已被删除
12#
发表于 2015-4-18 21:57:14 | 只看该作者
对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。
愤怒的大鸟 该用户已被删除
13#
发表于 2015-4-20 11:24:33 | 只看该作者
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
只想知道 该用户已被删除
14#
 楼主| 发表于 2015-4-26 10:10:45 | 只看该作者
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
飘飘悠悠 该用户已被删除
15#
发表于 2015-5-3 22:11:26 | 只看该作者
有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。
蒙在股里 该用户已被删除
16#
发表于 2015-6-13 00:11:11 | 只看该作者
微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox  支持的不是很好,所以能少用还是少用的好。
精灵巫婆 该用户已被删除
17#
发表于 2015-6-27 04:08:08 | 只看该作者
基础有没有对学习php没有太大区别,关键是兴趣。
冷月葬花魂 该用户已被删除
18#
发表于 2015-7-4 22:01:10 | 只看该作者
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
莫相离 该用户已被删除
19#
发表于 2015-7-6 16:46:18 | 只看该作者
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 19:03

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表