亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 編程 > PHP > 正文

如何用PHP把RDF內(nèi)容插入Web站點(diǎn)之中(二)

2019-09-08 23:11:15
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

鮮肉

既然從技術(shù)上講,RSS是結(jié)構(gòu)良好的XML文檔,所以可以用標(biāo)準(zhǔn)的XML編程技術(shù)來(lái)處理它。主要有兩種技術(shù):SAX(the Simple API for XML)和DOM(the Document Object Model)。

SAX分析器工作時(shí)遍歷整個(gè)XML文檔,在遇到不用類(lèi)型的標(biāo)記時(shí)調(diào)用特定的函數(shù)。比如,調(diào)用特定函數(shù)處理一個(gè)開(kāi)始標(biāo)記,調(diào)用另一個(gè)函數(shù)處理一個(gè)結(jié)束標(biāo)記,再調(diào)用一個(gè)函數(shù)處理兩者之間的數(shù)據(jù)。分析器的職責(zé)僅僅是順序遍歷這個(gè)文檔。而它所調(diào)用的函數(shù)負(fù)責(zé)處理發(fā)現(xiàn)的標(biāo)記。一旦一個(gè)標(biāo)記被處理完畢,分析器繼續(xù)分析文檔中的下一個(gè)元素,這一過(guò)程不斷重復(fù)。

另一方面,DOM分析器工作是把整個(gè)XML文檔讀進(jìn)內(nèi)存當(dāng)中,并將之轉(zhuǎn)換成一種分層的樹(shù)型結(jié)構(gòu)。而且為訪(fǎng)問(wèn)不同的樹(shù)結(jié)點(diǎn)(以及結(jié)點(diǎn)所附的內(nèi)容)提供了API。遞歸處理方式加上API函數(shù)使得開(kāi)發(fā)者能夠區(qū)分不同類(lèi)型的結(jié)點(diǎn)(元素,屬性,字符數(shù)據(jù),注釋等),同時(shí)根據(jù)文檔樹(shù)的結(jié)點(diǎn)類(lèi)型和結(jié)點(diǎn)深度,使得執(zhí)行不同的動(dòng)作成為可能。

SAX和DOM分析器幾乎支持每一種語(yǔ)言,包括你我的最?lèi)?ài)――PHP。我將在這篇文章中利用PHP的SAX分析器處理RDF的例子。 當(dāng)然,使用DOM分析器也同樣很容易。

讓我們看這個(gè)簡(jiǎn)單的例子,把它記在腦海里。下面是一個(gè)我將要使用的RDF文件,這個(gè)文件直接選自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>

下面是分析這一文檔并顯示其中數(shù)據(jù)的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)))
   {
/t   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")
 {
/t   $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")
 {
/t   echo "<hr>";
/t   $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)
 {
/t   echo "$currentTag: $data <br>";
 }
}

?>

看不明白? 別著急,后面將會(huì)作出解釋。

捕獲旗標(biāo)

這段腳本首先要做的是設(shè)定一些全局變量:

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

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

$currentTag變量保存是分析器當(dāng)前處理的元素的名稱(chēng)――你很快就會(huì)看到為什么需要它。

因?yàn)槲业淖罱K目的是顯示頻道中的每一個(gè)單獨(dú)的條目(item),并且?guī)в墟溄Y(jié)。另外還要知道分析器什么時(shí)候退出了<channel></channel>區(qū)塊,什么時(shí)候又進(jìn)入了文檔的 <item></item>部分。再說(shuō)我用的是SAX分析器,它按順序方式工作,沒(méi)有任何分析器API可供使用,無(wú)法知道文檔樹(shù)中的深度和位置。所以,我不得不自己發(fā)明一個(gè)機(jī)制來(lái)做這件事――這就是引入$flag變量的原因。

$flag變量將用于判斷分析器是在<channel>區(qū)塊還是在<item>區(qū)塊里面。

下一步要做的是初始化SAX分析器,并開(kāi)始分析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)))
   {
/t   die("XML parser error: " .
xml_error_string(xml_get_error_code($xp)));
   }
}

// destroy parser
xml_parser_free($xp);

這段代碼簡(jiǎn)單明了,其中的注釋已經(jīng)解釋的足夠清楚了。xml_parser_create()函數(shù)建立一個(gè)分析器實(shí)例,并將之賦給句柄$xp。接著再創(chuàng)建回調(diào)函數(shù)處理開(kāi)標(biāo)記和閉標(biāo)記,以及二者之間的字符數(shù)據(jù)。最后,xml_parse()函數(shù)聯(lián)合多次fread()調(diào)用,讀取RDF文件并分析它。

在文檔中,每次遇到開(kāi)標(biāo)記,開(kāi)標(biāo)記處理器elementBegin()就會(huì)被調(diào)用。

// 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")
 {
/t   $flag = 1;
 }
}

這個(gè)函數(shù)以當(dāng)前標(biāo)記的名稱(chēng)和屬性作為起參數(shù)。標(biāo)記名稱(chēng)被賦值給全局變量$currentTag。如果,這個(gè)開(kāi)標(biāo)記是<item>,那么把$flag變量置1。

同樣,如果遇到閉標(biāo)記,那么閉標(biāo)記處理器elementEnd()將被調(diào)用。

// 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")
 {
/t   echo "<hr>";
/t   $flag = 0;
 }
}

閉標(biāo)記處理函數(shù)也是以標(biāo)記名稱(chēng)作為其參數(shù)。如果是遇到的是一個(gè)為</item>的閉標(biāo)記,變量$flag的值重置為0,并把變量$currentTag的值清空。

那么,如何處理標(biāo)記之間的字符數(shù)據(jù)呢? 這才是我們的興趣所在。先向字符數(shù)據(jù)處理器characterData()打個(gè)招呼吧。

// 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)
 {
/t   echo "$currentTag: $data <br>";
 }
}

現(xiàn)在你可以看一下傳給這個(gè)函數(shù)的參數(shù),你會(huì)發(fā)現(xiàn)它只接收了開(kāi)標(biāo)記和閉標(biāo)記之間的數(shù)據(jù),而根本不知道分析器當(dāng)前正在處理哪個(gè)標(biāo)記。而這正事我們一開(kāi)始就引入全局變量$currentTag的原因。

如果$flag變量的值為1,也就是說(shuō)如果分析器當(dāng)前處于<item></itme>區(qū)塊之間,那么當(dāng)前被處理的元素,不管是<title>,<link>還是<description>,數(shù)據(jù)都被打印到輸出設(shè)備上(在這里,輸出設(shè)備是Web瀏覽器),并在每個(gè)元素的輸出后面加上換行符<br>。

整個(gè)RDF文檔就是以這種順序方式處理,每發(fā)現(xiàn)一個(gè)<item>標(biāo)記就顯示一定的輸出。你可以看一下下面的運(yùn)行結(jié)果:

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
日韩精品欧美成人高清一区二区| 天涯成人国产亚洲精品一区av| 五月天国产精品| 欧美少妇bbb| 懂色av粉嫩av浪潮av| 亚洲一级黄色| 999久久欧美人妻一区二区| www·91·com| 黄页在线免费观看| 一道精品视频一区二区三区男同| 成人黄色大片在线观看| 中文字幕在线视频区| 亚洲精品福利在线| 欧美性猛交xxxx久久久| 国产三级一区二区三区| 妺妺窝人体色777777| 国产97在线观看| 亚洲欧洲国产精品久久| 日韩av视屏| 中文字幕乱伦视频| 在线观看视频色| 国产在线播放一区三区四| 狠狠干狠狠搞| 看片一区二区| 欧美一区二区三区四区在线观看地址| 国产乱淫av一区二区三区| 澳门久久精品| jizz一区二区三区| 欧美精品一区二区三区国产精品| 调教驯服丰满美艳麻麻在线视频| 日本高清视频在线播放| 高潮按摩久久久久久av免费| 久久影院午夜片一区| 亚洲精品免费观看| 精品一区二区三区免费毛片| 国产大片精品免费永久看nba| 亚洲剧情一区二区| 麻豆成人久久精品二区三区小说| 91在线视频观看| 日韩av无码中文字幕| 成人精品一区二区三区电影免费| 日本一区二区三区在线观看视频| 亚洲资源在线播放| 久久精品视频在线观看榴莲视频| 成人情趣视频| 99久久久无码国产精品性| 人妻激情偷乱频一区二区三区| 久草免费福利在线| 自拍偷拍欧美| 麻豆福利在线观看| 国产精品高潮久久久久无| 图片专区亚洲欧美另类| 成午夜精品一区二区三区软件| 可以看美女隐私的网站| 老司机久久精品| 欧美成人aaa片一区国产精品| 成人黄色在线播放| 在线资源免费观看| 久久先锋影音av鲁色资源网| 精品中文视频| 免费a级毛片永久免费| 久久久久成人精品无码中文字幕| 被陌生人带去卫生间啪到腿软| 视频国产在线观看| 欧美日韩在线精品一区二区三区激情| 精品精品国产高清a毛片牛牛| 91色视频在线| 欧美性大战久久久久xxx| 国内精品美女av在线播放| 黄色精品一二区| 高清中文字幕mv的电影| 日本电影久久久| 超清av在线| 伊人久久亚洲影院| 精品电影在线| 久久精品99国产国产精| 午夜精品久久久久久久久久久| 亚洲色成人www永久在线观看| 亚洲第一成人在线视频| 在线观看免费视频污| 欧美日韩亚洲一区二区三区在线| 中文无码日韩欧| 在线观看欧美日韩| 一本色道久久综合亚洲精品不| 国产三级视频在线播放| 国产乡下妇女做爰| 亚洲网站在线| 色之综合天天综合色天天棕色| 亚州一区二区| 欧美国产一级| 日韩一区二区在线看片| 不卡一区中文字幕| 天天射夜夜爽| 天天综合网入口| 欧美日韩视频在线观看一区二区三区| 日韩一区二区麻豆国产| 国产成人在线视频免费观看| 蜜桃一级网站.| 精品少妇一区二区三区| 福利网站在线观看| 亚洲一级不卡视频| eeuss影院www免费视频| 国产高清视频色在线www| 亚洲精品视频在线| 精品福利av导航| 国产一区二区高清视频| 欧美+日本+国产+在线a∨观看| 久久精品国产99久久99久久久| 国产成人久久久精品一区| 国产一区二区三区电影在线观看| 欧美亚洲人成在线| 精品午夜av| 久久 天天综合| 亚洲天堂av在线免费| 中文一区一区三区免费| 性色88av老女人视频| 亚洲精品视频一区二区三区| 欧洲一区在线观看| 国产欧美日韩另类| 女人被狂躁到高潮的免费| 国产精品99精品一区二区三区∴| 成年人午夜视频在线观看| 亚洲精品电影在线| 欧美在线3区| 亚洲第一香蕉网| www.好吊操| 一区二区视频网站| 亚洲美女免费在线| 国产一区二区三区精品视频| 国产高清自拍一区| 精精国产xxx在线视频app| 91免费版在线看| 国产69精品久久久久9| 国产成人高清精品| 国产不卡精品视男人的天堂| 香蕉久久精品| 欧美亚洲成人免费| 亚洲东热激情| 亚洲男人天堂2020| 欧美日韩影视| 欧美行性性性o00x| 麻豆一区二区麻豆免费观看| 欧美xxx网站| 免费不卡中文字幕视频| 日韩专区在线播放| 久久这里只精品最新地址| 国产亚洲精品久久久久久| 最大av网站| 欧美成人专区| 高潮毛片7777777毛片| 在线成人超碰| 在线观看视频免费| 神马久久一区二区三区| www91在线观看| 国产精品18毛片一区二区| 性农村xxxxx小树林| 国产精品亚洲第一| 麻豆影视在线观看_| 欧美成人一区在线观看| 欧美大片网站在线观看| 最新中文在线视频| 顶级欧美妇高清xxxxx| 亚洲综合一二三区| 国产成a人亚洲精v品在线观看| 亚洲影视一区二区三区| 日韩精品一区二区亚洲av| 国产精品福利一区二区三区| 日韩免费三级| 亚洲成人午夜在线| 国产剧情日韩欧美| 草民电影神马电影一区二区| 色哟哟一区二区三区| 久久久午夜视频| 无码国产69精品久久久久同性| 中文字幕久久精品| 无码人妻少妇色欲av一区二区| 欧美精品一区二区视频| 三上亚洲一区二区| 韩国女主播成人在线观看| av一区二区在线观看| 亚洲一区中文字幕| 999久久久免费精品国产牛牛| 国产精品入口免费视频一| 精品伦精品一区二区三区视频密桃| 俄罗斯女人裸体性做爰| 欧美极品在线播放| 日韩在线影视| 日产精品久久久| 久久精品成人欧美大片古装| 免费在线观看一级片| 久久久综合久久| 亚洲电影在线| 日本一区免费观看| 精品一二三四区| 天天爱天天色| 久久av一区二区| 亚洲线精品一区二区三区八戒| 97久久精品人人做人人爽50路| 欧美色图俺去了| 欧美国产高潮xxxx1819| 久久久久国产视频| 中文字幕免费一区二区| 国产一区二区三区色淫影院| 久久久男人的天堂| 国产午夜精品美女毛片视频| 欧美国产成人精品| 亚洲bbw性色大片| 久久综合综合久久| 青青草福利视频| 欧美一级视频一区二区| 欧美亚洲精品在线| 日韩毛片网站| 99久久免费国产精品| 老司机精品视频一区二区三区| 免费黄网站在线| 国产精品一级二级三级| 性一交一乱一伦一色一情| 德国性xxxx| 久久久亚洲精华液精华液精华液| 99久久99热这里只有精品| 一本大道亚洲视频| 亚洲国产成人精品综合99| av永久免费观看| 欧美亚一区二区| 色97色成人| 亚洲激情久久久| 黄色aa久久| 激情六月丁香| 成人男女网免费| 中文字幕 亚洲一区| 国产不卡一区| 国产麻豆精品在线观看| 在线观看国产小视频| 日本美女一级片| 高清国产一区二区| 国产精品日韩电影| aaaa一级片| 男女男精品视频网站| 日韩一二区视频| 91高清国产视频| 亚洲伊人久久大香线蕉av| 欧美精品99| 中文字幕免费高清在线观看| 亚洲麻豆国产自偷在线| 免费观看在线午夜影视| 欧美老肥妇做.爰bbww| 国产精品无码乱伦| av一本久道久久综合久久鬼色| 人妻内射一区二区在线视频| 国产精品x453.com| 九色丨porny丨自拍入口| 欧美xxxx性xxxxx高清| www.视频在线.com| 精品国产综合区久久久久久| 影音先锋中文字幕第一页| 久草中文综合在线| 国语对白中文字幕| 99精品国产99久久久久久白柏| www.神马久久| 欧美视频一二区| 天天操夜夜逼| 爱福利视频一区| 亚洲精品免费一二三区| 久久久久成人精品免费播放动漫| 欧美猛男男办公室激情| 日本一区二区三区视频| 亚洲欧美日韩天堂| 成人有码视频在线播放| 国产一二三区精品视频| 美女又爽又黄免费动漫| 国产福利影院在线观看| 精品一区二区三区在线| 久久久九九九九| 久久久综合九色合综国产精品| 欧美欧美午夜aⅴ在线观看| 卡通动漫精品一区二区三区| 色999韩欧美国产综合俺来也| 精品一区二区三区五区六区| 欧美不卡在线视频| 婷婷六月天丁香| 秘密基地免费观看完整版中文| 37pao成人国产永久免费视频| gratisvideos另类灌满| 亚洲区一区二区三区| 欧美午夜视频在线观看| 中文字幕日韩欧美精品高清在线| 亚洲大片av| 影音先锋久久资源网| 久久在线免费视频| 欧美日韩国产美女| 美女日韩欧美| 欧美欧美欧美欧美首页| 国产91精品在线播放| 国产精一品亚洲二区在线视频| 99re免费99re在线视频手机版| 曰本三级日本三级日本三级| 美女国内精品自产拍在线播放| 好吊色视频988gao在线观看| av资源网在线观看| 国产精品少妇在线视频| 欧美日韩视频免费| 日韩精品一区二区三区第95| 午夜伦全在线观看| 国精产品一区一区三区四川| 国产在线播放一区二区| 色偷偷av男人的天堂| 国产一区二三区好的| 色综合激情五月| 国产伊人精品在线| 欧美人成在线观看ccc36| www.com污| 国产精品自拍视频| 扒开伸进免费视频| 国产极品久久久| 欧美精品日本| 在线视频中文字幕| 69ww免费视频播放器| 日本污视频在线观看| 成人av动漫| 久久99精品久久久久久| 91精品国模一区二区三区| 久久动漫网址| 欧美激情第四页| 欧美二区在线| 中文一区一区三区高中清不卡免费| 国产精品久久久av久久久| www.麻豆av.com| 国产喷水福利在线视频|