亚洲韩日午夜视频,欧美日韩在线精品一区二区三区,韩国超清无码一区二区三区,亚洲国产成人影院播放,久草新在线,在线看片AV色

您好,歡迎來到思海網絡,我們將竭誠為您提供優質的服務! 誠征網絡推廣 | 網站備案 | 幫助中心 | 軟件下載 | 購買流程 | 付款方式 | 聯系我們 [ 會員登錄/注冊 ]
促銷推廣
客服中心
業務咨詢
有事點擊這里…  531199185
有事點擊這里…  61352289
點擊這里給我發消息  81721488
有事點擊這里…  376585780
有事點擊這里…  872642803
有事點擊這里…  459248018
有事點擊這里…  61352288
有事點擊這里…  380791050
技術支持
有事點擊這里…  714236853
有事點擊這里…  719304487
有事點擊這里…  1208894568
有事點擊這里…  61352289
在線客服
有事點擊這里…  531199185
有事點擊這里…  61352288
有事點擊這里…  983054746
有事點擊這里…  893984210
當前位置:首頁 >> 技術文章 >> 文章瀏覽
技術文章

PHP中的XML應用

添加時間:2014-7-28 1:19:07  添加: 思海網絡 
 綜述

  XML代表Extensible Markup Language(eXtensible Markup Language的縮寫,意為可擴展的標記語言)。XML是一套定義語義標記的規則,這些標記將文檔分成許多部件并對這些部件加以標識。它也是元標記語言,即定義了用于定義其他與特定領域有關的、語義的、結構化的標記語言的句法語言。XML是當今最熱門的技術。而PHP也具有分析XML文檔的功能,下面我們將共同探討一下PHP中的XML應用的情況。

  XML概貌

  談起XML(eXtended Markup Language:可擴展標記語言),我們不妨先看一段HTML的代碼:

  <html> 
  <title>XML</title> 
  <body> 
  <p><center><font color="red">TEXT</font></center></p> 
  <a href="www.domain.com"><img src="http://edu.cnzz.cn/NewsInfo/logo.jpg"/></a> 
  </body> 
  </html> 

  上面這段代碼從結構上就符合XML的規則,XML可以理解是包含數據的樹形的結構類型:

  1、引用同一個元素的時候,使用一致的大小寫,如<center></Center>就是不符合規定的 
  2、任何屬性值(如 href="????")要用""引起來,如<a href=www.yahoo.com>就是不正確的
  3、所有元素必須由打開<和關閉>標注組成,元素應該形如<body></body>或空元素<img ... />,如果結尾的 "/>" 少了"/"就是錯誤的代碼 
  4、所有元素必須彼此嵌套,就像寫程序的循環一樣,而且,所有的元素必須嵌套于根元素之中,比如上面的代碼所有的內容都嵌套于<html></html>之中。 
  5、元素名稱(即上面的body a p img等)應為字母開頭。

  怎樣應用PHP的XML解析器Expat?

  Expat是PHP腳本語言的XML解析器(同樣稱為XML處理器),可以使程序訪問XML文檔的結構和內容。它是一種基于事件的解析器。XML解析器有兩種基本類型:

  基于樹型的解析器:將XML文檔轉換成樹型結構。這類解析器分析整篇文章,同時提供一個API來訪問所產生樹的每個元素。其通用的標準為DOM(文檔對象模式)。

  基于事件的解析器:將XML文檔視為一系列的事件。當一個特殊事件發生時,解析器將調用開發者提供的函數來處理。基于事件的解析器有一個XML文檔的數據集中視圖,也就是說它集中在XML文檔的數據部分,而不是其結構。這些解析器從頭到尾處理文檔,并將類似于-元素的開始、元素的結尾、特征數據的開始等等-事件通過回調(callback)函數報告給應用程序。

  以下是一個"Hello-World"的XML文檔范例:

<greeting> 
Hello World 
</greeting> 

  基于事件的解析器將報告為三個事件:

  開始元素:greeting 
  CDATA項的開始,值為:Hello World 
  結束元素:greeting

  基于事件的解析器不產生描述文檔的結構,當然如果使用Expat,必要時它一樣可以在PHP中生成完全的原生樹結構。在CDATA項中,基于事件的解析器不會得到父元素greeting的信息。然而,它提供一個更底層的訪問,這就使得可以更好地利用資源和更快地訪問。通過這種方式,就沒有必要將整個文檔放入內存;而事實上,整個文檔甚至可以大于實際內存值。

  上面Hello-World的范例雖然包括完整的XML格式,但它是無效的,因為既沒有DTD(文檔類型定義)與其聯系,也沒有內嵌DTD。但是Expat是一個不檢查有效性的解析器,因此忽略任何與文檔聯系的DTD。應注意的是文檔仍然需要完整的格式,否則Expat(和其他符合XML標準的解析器一樣)將會隨著出錯信息而停止。

  編譯Expat

  Expat可以編譯進PHP3.0.6版本(或以上)中。從Apache1.3.22開始,Expat已經作為Apache的一部分。在Unix系統中,可以通過-with-xml選項配置PHP將其編譯入PHP。

  如果將PHP編譯為Apache的模塊,而Expat將默認作為Apache的一部分。在Windows中,則必須要加載XML動態連接庫。

  XML范例:XMLstats 
  我們所要討論的范例是使用Expat來收集XML文檔的統計數據。

  對于文檔中每個元素,以下信息都將被輸出: 
該元素在文檔中使用的次數 
該元素中字符數據的數量

元素的父元素

元素的子元素 
  注意:為了演示,我們利用PHP來產生一個結構來保存元素的父元素和子元素


 用于產生XML解析器實例的函數有哪些?

  用于產生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() 其它沒有指定處理函數的事件

  所有的回調函數必須將解析器的實例作為其第一個參數(此外還有其它參數)。

  對于本文最后的范例腳本,需要注意的是它既用到了元素處理函數又用到了字符數據處理函數。元素的回調處理函數通過xml_set_element_handler()來注冊。

  這個函數需要三個參數:

  解析器的實例 
  處理開始元素的回調函數的名稱 
  處理結束元素的回調函數的名稱

  當開始解析XML文檔時,回調函數必須存在。它們必須定義為與PHP手冊中所描述的原型一致。

  例如,Expat將三個參數傳遞給開始元素的處理函數。在腳本范例中,其定義如下:

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

  $parser是解析器標志,$name是開始元素的名稱,$attrs為包含元素所有屬性和值的數組。

  一旦開始解析XML文檔,Expat在遇到開始元素是都將調用start_element()函數并將參數傳遞過去。

  XML的Case Folding選項

  用xml_parser_set_option()函數將Case folding選項關閉。這個選項默認是打開的,使得傳遞給處理函數的元素名自動轉換為大寫。但XML對大小寫是敏感的(所以大小寫對統計XML文檔是非常重要的)。對于我們的范例,case folding選項必須關閉。

  如何對文檔進行解析?

  在完成所有的準備工作后,現在腳本終于可以解析XML文檔:

  Xml_parse_from_file(),一個自定義的函數,打開參數中指定的文件,并以4kb的大小進行解析 
xml_parse(),和xml_parse_from_file()一樣,當發生錯誤時,即XML文檔的格式不完全時,將會返回false。

  我們可以使用xml_get_error_code()函數來得到最后一個錯誤的數字代碼。將此數字代碼傳遞給xml_error_string()函數即可得到錯誤的文本信息。輸出XML當前的行數,使得調試更容易。

  當解析文檔時,對于Expat需要強調問題的是:如何保持文檔結構的基本描述?

  如前所述,基于事件的解析器本身并不產生任何結構信息。不過標簽(tag)結構是XML的重要特性。例如,元素序列<book><title>表示的意思不同于<figure><title>。書名和圖名是沒有關系的,雖然它們都用到"title"這個術語。因此,為了更有效地使用基于事件的解析器處理XML,必須使用自己的棧(stacks)或列表(lists)來維護文檔的結構信息。

  為了產生文檔結構的鏡像,腳本至少需要知道目前元素的父元素。用Exapt的API是無法實現的,它只報告目前元素的事件,而沒有任何前后關系的信息。因此,需要建立自己的棧結構。

  腳本范例使用先進后出(FILO)的棧結構。通過一個數組,棧將保存全部的開始元素。對于開始元素處理函數,目前的元素將被array_push()函數推到棧的頂部。相應的,結束元素處理函數通過array_pop()將最頂的元素移走。

  對于序列<book><title></title></book>,棧的填充如下:

  開始元素book:將"book"賦給棧的第一個元素($stack[0])。 
  開始元素title:將"title"賦給棧的頂部($stack[1])。 
  結束元素title:從棧中將最頂部的元素移去($stack[1])。 
  結束元素title:從棧中將最頂部的元素移去($stack[0])。

  PHP3.0通過一個$depth變量手動控制元素的嵌套來實現范例,這就使腳本看起來比較復雜。PHP4.0通過array_pop()和array_push()兩個函數來使腳本看起來更簡潔。

  如何收集XML文檔中的元素信息?

  為了收集每個元素的信息,腳本需要記住每個元素的事件。通過使用一個全局的數組變量$elements來保存文檔中所有不同的元素。數組的項目是元素類的實例,有4個屬性(類的變量)

  $count -該元素在文檔中被發現的次數 
  $chars -元素中字符事件的字節數 
  $parents -父元素 
  $childs - 子元素

  注意:PHP的一個特性是你可以通過while(list() = each())loop遍歷整個類結構,如同你遍歷整個相應的數組一樣。所有的類變量(當你用PHP3.0時還有方法名)都以字符串的方式輸出。

  當發現一個元素時,我們需要增加其相應的記數器來跟蹤它在文檔中出現多少次。在相應的$elements項中的記數元素也要加一。

  我們同樣要讓父元素知道目前的元素是它的子元素。因此,目前元素的名稱將會加入到父元素的$childs數組的項目中。最后,目前元素應該記住誰是它的父元素。所以,父元素被加入到目前元素$parents數組的項目中。

  顯示統計信息

  剩下的代碼在$elements數組和其子數組中循環顯示其統計結果。這就是最簡單的嵌套循環,盡管輸出正確的結果,但代碼既不簡潔又沒有任何特別的技巧,它僅僅是一個你可能每天用他來完成工作的循環。


 腳本范例被設計為通過PHP的CGI方式的命令行來調用。因此,統計結果輸出的格式為文本格式。如果你要將腳本運用到互聯網上,那么你需要修改輸出函數來產生HTML格式。

  如何用PHP&XML編制一個迷你搜索引擎實例?

  讓我們首先來熟悉一下我們程序中用到的那個XML(保存為xyz.xml)。

<?xml version="1.0" encoding="gb2312" ?>
<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</web> 
</sub> 
</sub> 
</sub> 
</links>

  它的結構相當簡單,根元素就是links,sub代表著一個類別,web就是一個網站的信息,其中包含著屬性,url代表網站的聯接,memo為備注信息,<web>??</web> 、<sub>??</sub>中包含的為元素的數據在這里就是類別和網站的名稱,這是符合上面的規定的。

  現在我們來回答上面提出的問題:為什么要用XML來編制搜索引擎?
  第一個原因就是有時候由于各種原因我們可能不能用到數據庫(MySQL或者其他);
  其次,對于小數據量的搜索引擎來說,它的數據量很小,如果用數據庫來做,效率未必有多高;

  最重要的一點是,這個搜索引擎維護起來相當的簡單,并且不用編寫繁瑣的數據庫的維護的程序。例如,我們要添加一個類別或者網頁,只要編輯文本的文件,加上一福紈eb>???</web>或是<sub>????</sub>就可以了,而且,如果想把一個類別移動到另一個地方的話,我們只要將這一部分的sub復制過去就行了。

  下面一個最簡單的用PHP顯示XML的范例。

  下面的程序是將解析XML并按照樹形結構輸出至瀏覽器,并顯示每層的元素總數。

<?php
$file = "demo.xml";// XML文件
function xml_parse_from_file($parser, $file) {// 解析XML文件的函數 }
function start_element($parser, $name, $attrs) {//遇到了開元素標記如<a href="link">就執行這一段}
function stop_element($parser, $name) {//遇到了開元素標記如</body>就執行這一段}
function data($parser, $data) {……}
function showcount(){ //顯示每一層的元素總數}

global $level,$levelcount,$maxlevel; 
$level = -1; 
$parser = xml_parser_create();// 產生解析器的實例 
xml_set_element_handler($parser, "start_element", "stop_element"); // 設置處理函數 
xml_set_character_data_handler($parser, "data"); 
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); 
$ret = xml_parse_from_file($parser, $file); // 解析文件 
if(!$ret) { 
die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($parser)), xml_get_current_line_number($parser))); 

xml_parser_free($parser); // 釋放解析器 
showcount();
?> 

  在上面的程序的基礎上,可以顯示一段子樹,我們依照元素的層數和他在該層的第幾號來對他進行定位

  例如:

    links (0,1) 
    +----web (1,1) 
    +----sub (1,2) 
    | +----web (2,1) 
    | +----sub (2,2) 
    | | +----web (3,1) 
    | | +----sub (3,2) 
    : 
    : 
    : 

  下面的代碼是我們的搜索引擎的基礎。因為,要顯示出一個子類別(如程序設計->PHP->)的信息就要用到他。

<?php
……
function start_element($parser, $name, $attrs) { 
global $level,$levelcount,$maxlevel,$hide,$lev,$num,$PHP_SELF; 
$level += 1; 
if($level>$maxlevel)
$maxlevel=$level; 
$levelcount[$level]+=1;

if($hide){ //判斷是否在子樹的范圍內,$hide==FALSE 為在 
if($level==$lev&&$levelcount[$level]==$num)
$hide=FALSE; 
}else{ 
if($level<=$lev)$hide=TRUE; 
}

if(!$hide){ 
……//輸出

}
function data($parser, $data) { 
global $level,$hide; 
if(!$hide){ 
if(trim($data)!=""){ echo trim($data); } 
}
}
……
global $hide,$lev,$num,$PHP_SELF; 
$level = -1; 
$hide = TRUE; 
echo "<p><a href=$PHP_SELF>Root</a></p>"; 
if($lev==""){
$lev=0;$num=1;
}
……
?>

  mini的搜索引擎到底如何做呢?

  作了若干的鋪墊,下面我們就來看一下我們的搜索引擎的主要文件。

  第一段為仿sina,yahoo的按照類別查詢 
  第二段為搜索查詢部分(把整個樹遍歷一遍)顯示符合的內容。

  xml3.php

  關鍵字匹配采用eregi函數,我們假設輸入的文字都是不會導致錯誤的。

關鍵字:PHP、XML、規則

分享到:

頂部 】 【 關閉
版權所有:佛山思海電腦網絡有限公司 ©1998-2024 All Rights Reserved.
聯系電話:(0757)22630313、22633833
中華人民共和國增值電信業務經營許可證: 粵B1.B2-20030321 備案號:粵B2-20030321-1
網站公安備案編號:44060602000007 交互式欄目專項備案編號:200303DD003  
察察 工商 網安 舉報有獎  警警  手機打開網站