|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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>标志就显示必定的输入。你可以看一下上面的运转了局:
只要实现最基本的功能就可以了 就是可以添加留言 然后可以显示留言,然后加入管理功能 |
|