php xml分析函數(shù)代碼第1/2頁
更新時間:2008年08月27日 13:02:52 作者:
我最喜愛的腳本語言不但支持XML而且對其支持正不斷加強。PHP可以讓我迅速將XML文檔發(fā)布到互聯(lián)網(wǎng)上,收集XML文檔的統(tǒng)計信息,將XML文檔轉(zhuǎn)換成其它格式。
首先我得承認我喜歡計算機標準。如果每個人都遵從這個行業(yè)的標準,互聯(lián)網(wǎng)將會是一個更好的媒體。使用標準化的數(shù)據(jù)交換格式才能使開放的和獨立于平臺的計算模式切實可行。這就是我作為XML愛好者的原因。
幸運的是,我最喜愛的腳本語言不但支持XML而且對其支持正不斷加強。PHP可以讓我迅速將XML文檔發(fā)布到互聯(lián)網(wǎng)上,收集XML文檔的統(tǒng)計信息,將XML文檔轉(zhuǎn)換成其它格式。例如,我時常用PHP的XML處理能力來管理我用XML所寫的文章和書。
本文中,我將討論任何用PHP內(nèi)建的Expat解析器來處理XML文檔。通過范例,我將演示Expat的處理方法。同時,范例可以告訴你
如何:
建立你自己的處理函數(shù)
將XML文檔轉(zhuǎn)換成你自己的PHP數(shù)據(jù)結(jié)構(gòu)
介紹Expat
XML的解析器,同樣稱為XML處理器,可以使程序訪問XML文檔的結(jié)構(gòu)和內(nèi)容。Expat是PHP腳本語言的XML解析器。它同時也運用在
其它項目中,例如Mozilla、Apache和Perl。
什么是基于事件的解析器?
XML解析器的兩種基本類型:
基于樹型的解析器:將XML文檔轉(zhuǎn)換成樹型結(jié)構(gòu)。這類解析器分析整篇文章,同時提供一個API來訪問所產(chǎn)生樹的每個元素。其通
用的標準為DOM(文檔對象模式)。
基于事件的解析器:將XML文檔視為一系列的事件。當一個特殊事件發(fā)生時,解析器將調(diào)用開發(fā)者提供的函數(shù)來處理。
基 于事件的解析器有一個XML文檔的數(shù)據(jù)集中視圖,也就是說它集中在XML文檔的數(shù)據(jù)部分,而不是其結(jié)構(gòu)。這些解析器從頭到尾
處理文檔,并將類似于-元素的 開始、元素的結(jié)尾、特征數(shù)據(jù)的開始等等-事件通過回調(diào)(callback)函數(shù)報告給應(yīng)用程序。以
下是一個"Hello-World"的XML文檔范例:
<greeting>
Hello World
</greeting>
基于事件的解析器將報告為三個事件:
開始元素:greeting
CDATA項的開始,值為:Hello World
結(jié)束元素:greeting
不像基于樹型的解析器,基于事件的解析器不產(chǎn)生描述文檔的結(jié)構(gòu)。在CDATA項中,基于事件的解析器不會讓你得到父元素
greeting的信息。
然而,它提供一個更底層的訪問,這就使得可以更好地利用資源和更快地訪問。通過這種方式,就沒有必要將整個文檔放入內(nèi)存
;而事實上,整個文檔甚至可以大于實際內(nèi)存值。
Expat就是這樣的一種基于事件的解析器。當然如果使用Expat,必要時它一樣可以在PHP中生成完全的原生樹結(jié)構(gòu)。
上面Hello-World的范例包括完整的XML格式。但它是無效的,因為既沒有DTD(文檔類型定義)與其聯(lián)系,也沒有內(nèi)嵌DTD。
對于Expat,這并沒有區(qū)別:Expat是一個不檢查有效性的解析器,因此忽略任何與文檔聯(lián)系的DTD。但應(yīng)注意的是文檔仍然需要完
整的格式,否則Expat(和其他符合XML標準的解析器一樣)將會隨著出錯信息而停止。
作為不檢查有效性的解析器,Exapt的快速性和輕巧性使其十分適合互聯(lián)網(wǎng)程序。
編譯Expat
Expat可以編譯進PHP3.0.6版本(或以上)中。從Apache1.3.9開始,Expat已經(jīng)作為Apache的一部分。在Unix系統(tǒng)中,通過-with
-xml選項配置PHP,你可以將其編譯入PHP。
如果你將PHP編譯為Apache的模塊,而Expat將默認作為Apache的一部分。在Windows中,你則必須要加載XML動態(tài)連接庫。
XML范例:XMLstats
了解Expat的函數(shù)的一個辦法就是通過范例。我們所要討論的范例是使用Expat來收集XML文檔的統(tǒng)計數(shù)據(jù)。
對于文檔中每個元素,以下信息都將被輸出:
該元素在文檔中使用的次數(shù)
該元素中字符數(shù)據(jù)的數(shù)量
元素的父元素
元素的子元素
注意:為了演示,我們利用PHP來產(chǎn)生一個結(jié)構(gòu)來保存元素的父元素和子元素
準備
用 于產(chǎn)生XML解析器實例的函數(shù)為xml_parser_create()。該實例將用于以后的所有函數(shù)。這個思路非常類似于PHP中MySQL函數(shù)的
連接 標記。在解析文檔前,基于事件的解析器通常要求你注冊回調(diào)函數(shù)-用于特定的事件發(fā)生時調(diào)用。Expat沒有例外事件,它
定義了如下七個可能事件:
對象 XML解析函數(shù) 描述
元素 xml_set_element_handler() 元素的開始和結(jié)束
字符數(shù)據(jù) xml_set_character_data_handler() 字符數(shù)據(jù)的開始
外部實體 xml_set_external_entity_ref_handler() 外部實體出現(xiàn)
未解析外部實體 xml_set_unparsed_entity_decl_handler() 未解析的外部實體出現(xiàn)
處理指令 xml_set_processing_instruction_handler() 處理指令的出現(xiàn)
記法聲明 xml_set_notation_decl_handler() 記法聲明的出現(xiàn)
默認 xml_set_default_handler() 其它沒有指定處理函數(shù)的事件
所有的回調(diào)函數(shù)必須將解析器的實例作為其第一個參數(shù)(此外還有其它參數(shù))。
對于本文最后的范例腳本。你需要注意的是它既用到了元素處理函數(shù)又用到了字符數(shù)據(jù)處理函數(shù)。元素的回調(diào)處理函數(shù)通過
xml_set_element_handler()來注冊。
這個函數(shù)需要三個參數(shù):
解析器的實例
處理開始元素的回調(diào)函數(shù)的名稱
處理結(jié)束元素的回調(diào)函數(shù)的名稱
當開始解析XML文檔時,回調(diào)函數(shù)必須存在。它們必須定義為與PHP手冊中所描述的原型一致。
例如,Expat將三個參數(shù)傳遞給開始元素的處理函數(shù)。在腳本范例中,其定義如下:
function start_element($parser, $name, $attrs)
第一個參數(shù)是解析器標示,第二個參數(shù)是開始元素的名稱,第三參數(shù)為包含元素所有屬性和值的數(shù)組。
一旦你開始解析XML文檔,Expat在遇到開始元素是都將調(diào)用你的start_element()函數(shù)并將參數(shù)傳遞過去。
XML的Case Folding選項
用xml_parser_set_option ()函數(shù)將Case folding選項關(guān)閉。這個選項默認是打開的,使得傳遞給處理函數(shù)的元素名自動轉(zhuǎn)換為
大寫。但XML對大小寫是敏感的(所以大小寫對統(tǒng)計XML文檔是非 常重要的)。對于我們的范例,case folding選項必須關(guān)閉。
解析文檔
在完成所有的準備工作后,現(xiàn)在腳本終于可以解析XML文檔:
Xml_parse_from_file(),一個自定義的函數(shù),打開參數(shù)中指定的文件,并以4kb的大小進行解析
xml_parse()和xml_parse_from_file()一樣,當發(fā)生錯誤時,即XML文檔的格式不完全時,將會返回false。
你可以使用xml_get_error_code()函數(shù)來得到最后一個錯誤的數(shù)字代碼。將此數(shù)字代碼傳遞給xml_error_string()函數(shù)即可得到
錯誤的文本信息。
輸出XML當前的行數(shù),使得調(diào)試更容易。
在解析的過程中,調(diào)用回調(diào)函數(shù)。
描述文檔結(jié)構(gòu)
當解析文檔時,對于Expat需要強調(diào)問題的是:如何保持文檔結(jié)構(gòu)的基本描述?
如前所述,基于事件的解析器本身并不產(chǎn)生任何結(jié)構(gòu)信息。
不 過標簽(tag)結(jié)構(gòu)是XML的重要特性。例如,元素序列<book><title>表示的意思不同于< figure><title>。也就是說,任何作
者都會告訴你書名和圖名是沒有關(guān)系的,雖然它們都用到"title"這個術(shù)語。因此, 為了更有效地使用基于事件的解析器處理XML
,你必須使用自己的棧(stacks)或列表(lists)來維護文檔的結(jié)構(gòu)信息。
為了產(chǎn)生文檔結(jié)構(gòu)的鏡像,腳本至少需要知道目前元素的父元素。用Exapt的API是無法實現(xiàn)的,它只報告目前元素的事件,而沒
有任何前后關(guān)系的信息。因此,你需要建立自己的棧結(jié)構(gòu)。
腳本范例使用先進后出(FILO)的棧結(jié)構(gòu)。通過一個數(shù)組,棧將保存全部的開始元素。對于開始元素處理函數(shù),目前的元素將被
array_push()函數(shù)推到棧的頂部。相應(yīng)的,結(jié)束元素處理函數(shù)通過array_pop()將最頂?shù)脑匾谱摺?
對于序列<book><title></title></book>,棧的填充如下:
開始元素book:將"book"賦給棧的第一個元素($stack[0])。
開始元素title:將"title"賦給棧的頂部($stack[1])。
結(jié)束元素title:從棧中將最頂部的元素移去($stack[1])。
結(jié)束元素title:從棧中將最頂部的元素移去($stack[0])。
PHP3.0通過一個$depth變量手動控制元素的嵌套來實現(xiàn)范例。這就使腳本看起來比較復(fù)雜。PHP4.0通過array_pop()和
array_push()兩個函數(shù)來使腳本看起來更簡潔。
收集數(shù)據(jù)
為了收集每個元素的信息,腳本需要記住每個元素的事件。通過使用一個全局的數(shù)組變量$elements來保存文檔中所有不同的元素
。數(shù)組的項目是元素類的實例,有4個屬性(類的變量)
$count -該元素在文檔中被發(fā)現(xiàn)的次數(shù)
$chars -元素中字符事件的字節(jié)數(shù)
$parents -父元素
$childs - 子元素
正如你所看到的,將類實例保存在數(shù)組中是輕而易舉的。
注意:PHP的一個特性是你可以通過while(list() = each())loop遍歷整個類結(jié)構(gòu),如同你遍歷整個相應(yīng)的數(shù)組一樣。所有的類變
量(當你用PHP3.0時還有方法名)都以字符串的方式輸出。
當發(fā)現(xiàn)一個元素時,我們需要增加其相應(yīng)的記數(shù)器來跟蹤它在文檔中出現(xiàn)多少次。在相應(yīng)的$elements項中的記數(shù)元素也要加一。
我們同樣要讓父元素知道目前的元素是它的子元素。因此,目前元素的名稱將會加入到父元素的$childs數(shù)組的項目中。最后,目
前元素應(yīng)該記住誰是它的父元素。所以,父元素被加入到目前元素$parents數(shù)組的項目中。
顯示統(tǒng)計信息
剩下的代碼在$elements數(shù)組和其子數(shù)組中循環(huán)顯示其統(tǒng)計結(jié)果。這就是最簡單的嵌套循環(huán),盡管輸出正確的結(jié)果,但代碼既不簡
潔又沒有任何特別的技巧,它僅僅是一個你可能每天用他來完成工作的循環(huán)。
腳本范例被設(shè)計為通過PHP的CGI方式的命令行來調(diào)用。因此,統(tǒng)計結(jié)果輸出的格式為文本格式。如果你要將腳本運用到互聯(lián)網(wǎng)上
,那么你需要修改輸出函數(shù)來產(chǎn)生HTML格式。
總結(jié)
Exapt是PHP的XML解析器。作為基于事件的解析器,它不產(chǎn)生文檔的結(jié)構(gòu)描述。但通過提供底層訪問,這就使得可以更好地利用資
源和更快地訪問。
作為一個不檢查有效性的解析器,Expat忽略與XML文檔連接的DTD,但如果文檔的格式不完整,它將會隨著出錯信息而停止。
提供事件處理函數(shù)來處理文檔
建立自己的事件結(jié)構(gòu)例如棧和樹來獲得XML結(jié)構(gòu)信息標記的優(yōu)點。
每天都有新的XML程序出現(xiàn),而PHP對XML的支持也不斷加強(例如,增加了支持基于DOM的XML解析器LibXML)。
有了PHP和Expat,你就可以為即將出現(xiàn)的有效、開放和獨立于平臺的標準作準備。
幸運的是,我最喜愛的腳本語言不但支持XML而且對其支持正不斷加強。PHP可以讓我迅速將XML文檔發(fā)布到互聯(lián)網(wǎng)上,收集XML文檔的統(tǒng)計信息,將XML文檔轉(zhuǎn)換成其它格式。例如,我時常用PHP的XML處理能力來管理我用XML所寫的文章和書。
本文中,我將討論任何用PHP內(nèi)建的Expat解析器來處理XML文檔。通過范例,我將演示Expat的處理方法。同時,范例可以告訴你
如何:
建立你自己的處理函數(shù)
將XML文檔轉(zhuǎn)換成你自己的PHP數(shù)據(jù)結(jié)構(gòu)
介紹Expat
XML的解析器,同樣稱為XML處理器,可以使程序訪問XML文檔的結(jié)構(gòu)和內(nèi)容。Expat是PHP腳本語言的XML解析器。它同時也運用在
其它項目中,例如Mozilla、Apache和Perl。
什么是基于事件的解析器?
XML解析器的兩種基本類型:
基于樹型的解析器:將XML文檔轉(zhuǎn)換成樹型結(jié)構(gòu)。這類解析器分析整篇文章,同時提供一個API來訪問所產(chǎn)生樹的每個元素。其通
用的標準為DOM(文檔對象模式)。
基于事件的解析器:將XML文檔視為一系列的事件。當一個特殊事件發(fā)生時,解析器將調(diào)用開發(fā)者提供的函數(shù)來處理。
基 于事件的解析器有一個XML文檔的數(shù)據(jù)集中視圖,也就是說它集中在XML文檔的數(shù)據(jù)部分,而不是其結(jié)構(gòu)。這些解析器從頭到尾
處理文檔,并將類似于-元素的 開始、元素的結(jié)尾、特征數(shù)據(jù)的開始等等-事件通過回調(diào)(callback)函數(shù)報告給應(yīng)用程序。以
下是一個"Hello-World"的XML文檔范例:
<greeting>
Hello World
</greeting>
基于事件的解析器將報告為三個事件:
開始元素:greeting
CDATA項的開始,值為:Hello World
結(jié)束元素:greeting
不像基于樹型的解析器,基于事件的解析器不產(chǎn)生描述文檔的結(jié)構(gòu)。在CDATA項中,基于事件的解析器不會讓你得到父元素
greeting的信息。
然而,它提供一個更底層的訪問,這就使得可以更好地利用資源和更快地訪問。通過這種方式,就沒有必要將整個文檔放入內(nèi)存
;而事實上,整個文檔甚至可以大于實際內(nèi)存值。
Expat就是這樣的一種基于事件的解析器。當然如果使用Expat,必要時它一樣可以在PHP中生成完全的原生樹結(jié)構(gòu)。
上面Hello-World的范例包括完整的XML格式。但它是無效的,因為既沒有DTD(文檔類型定義)與其聯(lián)系,也沒有內(nèi)嵌DTD。
對于Expat,這并沒有區(qū)別:Expat是一個不檢查有效性的解析器,因此忽略任何與文檔聯(lián)系的DTD。但應(yīng)注意的是文檔仍然需要完
整的格式,否則Expat(和其他符合XML標準的解析器一樣)將會隨著出錯信息而停止。
作為不檢查有效性的解析器,Exapt的快速性和輕巧性使其十分適合互聯(lián)網(wǎng)程序。
編譯Expat
Expat可以編譯進PHP3.0.6版本(或以上)中。從Apache1.3.9開始,Expat已經(jīng)作為Apache的一部分。在Unix系統(tǒng)中,通過-with
-xml選項配置PHP,你可以將其編譯入PHP。
如果你將PHP編譯為Apache的模塊,而Expat將默認作為Apache的一部分。在Windows中,你則必須要加載XML動態(tài)連接庫。
XML范例:XMLstats
了解Expat的函數(shù)的一個辦法就是通過范例。我們所要討論的范例是使用Expat來收集XML文檔的統(tǒng)計數(shù)據(jù)。
對于文檔中每個元素,以下信息都將被輸出:
該元素在文檔中使用的次數(shù)
該元素中字符數(shù)據(jù)的數(shù)量
元素的父元素
元素的子元素
注意:為了演示,我們利用PHP來產(chǎn)生一個結(jié)構(gòu)來保存元素的父元素和子元素
準備
用 于產(chǎn)生XML解析器實例的函數(shù)為xml_parser_create()。該實例將用于以后的所有函數(shù)。這個思路非常類似于PHP中MySQL函數(shù)的
連接 標記。在解析文檔前,基于事件的解析器通常要求你注冊回調(diào)函數(shù)-用于特定的事件發(fā)生時調(diào)用。Expat沒有例外事件,它
定義了如下七個可能事件:
對象 XML解析函數(shù) 描述
元素 xml_set_element_handler() 元素的開始和結(jié)束
字符數(shù)據(jù) xml_set_character_data_handler() 字符數(shù)據(jù)的開始
外部實體 xml_set_external_entity_ref_handler() 外部實體出現(xiàn)
未解析外部實體 xml_set_unparsed_entity_decl_handler() 未解析的外部實體出現(xiàn)
處理指令 xml_set_processing_instruction_handler() 處理指令的出現(xiàn)
記法聲明 xml_set_notation_decl_handler() 記法聲明的出現(xiàn)
默認 xml_set_default_handler() 其它沒有指定處理函數(shù)的事件
所有的回調(diào)函數(shù)必須將解析器的實例作為其第一個參數(shù)(此外還有其它參數(shù))。
對于本文最后的范例腳本。你需要注意的是它既用到了元素處理函數(shù)又用到了字符數(shù)據(jù)處理函數(shù)。元素的回調(diào)處理函數(shù)通過
xml_set_element_handler()來注冊。
這個函數(shù)需要三個參數(shù):
解析器的實例
處理開始元素的回調(diào)函數(shù)的名稱
處理結(jié)束元素的回調(diào)函數(shù)的名稱
當開始解析XML文檔時,回調(diào)函數(shù)必須存在。它們必須定義為與PHP手冊中所描述的原型一致。
例如,Expat將三個參數(shù)傳遞給開始元素的處理函數(shù)。在腳本范例中,其定義如下:
function start_element($parser, $name, $attrs)
第一個參數(shù)是解析器標示,第二個參數(shù)是開始元素的名稱,第三參數(shù)為包含元素所有屬性和值的數(shù)組。
一旦你開始解析XML文檔,Expat在遇到開始元素是都將調(diào)用你的start_element()函數(shù)并將參數(shù)傳遞過去。
XML的Case Folding選項
用xml_parser_set_option ()函數(shù)將Case folding選項關(guān)閉。這個選項默認是打開的,使得傳遞給處理函數(shù)的元素名自動轉(zhuǎn)換為
大寫。但XML對大小寫是敏感的(所以大小寫對統(tǒng)計XML文檔是非 常重要的)。對于我們的范例,case folding選項必須關(guān)閉。
解析文檔
在完成所有的準備工作后,現(xiàn)在腳本終于可以解析XML文檔:
Xml_parse_from_file(),一個自定義的函數(shù),打開參數(shù)中指定的文件,并以4kb的大小進行解析
xml_parse()和xml_parse_from_file()一樣,當發(fā)生錯誤時,即XML文檔的格式不完全時,將會返回false。
你可以使用xml_get_error_code()函數(shù)來得到最后一個錯誤的數(shù)字代碼。將此數(shù)字代碼傳遞給xml_error_string()函數(shù)即可得到
錯誤的文本信息。
輸出XML當前的行數(shù),使得調(diào)試更容易。
在解析的過程中,調(diào)用回調(diào)函數(shù)。
描述文檔結(jié)構(gòu)
當解析文檔時,對于Expat需要強調(diào)問題的是:如何保持文檔結(jié)構(gòu)的基本描述?
如前所述,基于事件的解析器本身并不產(chǎn)生任何結(jié)構(gòu)信息。
不 過標簽(tag)結(jié)構(gòu)是XML的重要特性。例如,元素序列<book><title>表示的意思不同于< figure><title>。也就是說,任何作
者都會告訴你書名和圖名是沒有關(guān)系的,雖然它們都用到"title"這個術(shù)語。因此, 為了更有效地使用基于事件的解析器處理XML
,你必須使用自己的棧(stacks)或列表(lists)來維護文檔的結(jié)構(gòu)信息。
為了產(chǎn)生文檔結(jié)構(gòu)的鏡像,腳本至少需要知道目前元素的父元素。用Exapt的API是無法實現(xiàn)的,它只報告目前元素的事件,而沒
有任何前后關(guān)系的信息。因此,你需要建立自己的棧結(jié)構(gòu)。
腳本范例使用先進后出(FILO)的棧結(jié)構(gòu)。通過一個數(shù)組,棧將保存全部的開始元素。對于開始元素處理函數(shù),目前的元素將被
array_push()函數(shù)推到棧的頂部。相應(yīng)的,結(jié)束元素處理函數(shù)通過array_pop()將最頂?shù)脑匾谱摺?
對于序列<book><title></title></book>,棧的填充如下:
開始元素book:將"book"賦給棧的第一個元素($stack[0])。
開始元素title:將"title"賦給棧的頂部($stack[1])。
結(jié)束元素title:從棧中將最頂部的元素移去($stack[1])。
結(jié)束元素title:從棧中將最頂部的元素移去($stack[0])。
PHP3.0通過一個$depth變量手動控制元素的嵌套來實現(xiàn)范例。這就使腳本看起來比較復(fù)雜。PHP4.0通過array_pop()和
array_push()兩個函數(shù)來使腳本看起來更簡潔。
收集數(shù)據(jù)
為了收集每個元素的信息,腳本需要記住每個元素的事件。通過使用一個全局的數(shù)組變量$elements來保存文檔中所有不同的元素
。數(shù)組的項目是元素類的實例,有4個屬性(類的變量)
$count -該元素在文檔中被發(fā)現(xiàn)的次數(shù)
$chars -元素中字符事件的字節(jié)數(shù)
$parents -父元素
$childs - 子元素
正如你所看到的,將類實例保存在數(shù)組中是輕而易舉的。
注意:PHP的一個特性是你可以通過while(list() = each())loop遍歷整個類結(jié)構(gòu),如同你遍歷整個相應(yīng)的數(shù)組一樣。所有的類變
量(當你用PHP3.0時還有方法名)都以字符串的方式輸出。
當發(fā)現(xiàn)一個元素時,我們需要增加其相應(yīng)的記數(shù)器來跟蹤它在文檔中出現(xiàn)多少次。在相應(yīng)的$elements項中的記數(shù)元素也要加一。
我們同樣要讓父元素知道目前的元素是它的子元素。因此,目前元素的名稱將會加入到父元素的$childs數(shù)組的項目中。最后,目
前元素應(yīng)該記住誰是它的父元素。所以,父元素被加入到目前元素$parents數(shù)組的項目中。
顯示統(tǒng)計信息
剩下的代碼在$elements數(shù)組和其子數(shù)組中循環(huán)顯示其統(tǒng)計結(jié)果。這就是最簡單的嵌套循環(huán),盡管輸出正確的結(jié)果,但代碼既不簡
潔又沒有任何特別的技巧,它僅僅是一個你可能每天用他來完成工作的循環(huán)。
腳本范例被設(shè)計為通過PHP的CGI方式的命令行來調(diào)用。因此,統(tǒng)計結(jié)果輸出的格式為文本格式。如果你要將腳本運用到互聯(lián)網(wǎng)上
,那么你需要修改輸出函數(shù)來產(chǎn)生HTML格式。
總結(jié)
Exapt是PHP的XML解析器。作為基于事件的解析器,它不產(chǎn)生文檔的結(jié)構(gòu)描述。但通過提供底層訪問,這就使得可以更好地利用資
源和更快地訪問。
作為一個不檢查有效性的解析器,Expat忽略與XML文檔連接的DTD,但如果文檔的格式不完整,它將會隨著出錯信息而停止。
提供事件處理函數(shù)來處理文檔
建立自己的事件結(jié)構(gòu)例如棧和樹來獲得XML結(jié)構(gòu)信息標記的優(yōu)點。
每天都有新的XML程序出現(xiàn),而PHP對XML的支持也不斷加強(例如,增加了支持基于DOM的XML解析器LibXML)。
有了PHP和Expat,你就可以為即將出現(xiàn)的有效、開放和獨立于平臺的標準作準備。
相關(guān)文章
EarthLiveSharp中cloudinary的CDN圖片緩存自動清理python腳本
這篇文章主要介紹了EarthLiveSharp暫時沒有清理cloudinary的CDN圖片緩存的功能,于是我用python寫了一個,并嘗試用gist管理,需要的朋友可以參考下2017-04-04php的日期處理函數(shù)及uchome的function_coomon中日期處理函數(shù)的研究
經(jīng)常在用php的時候會碰到一個關(guān)于時間日期的問題還有時區(qū)差異的問題,以前作項目的時候會把時間搞錯,要么就是提前八小時了,要么那個時間就是驢唇不對馬嘴的,現(xiàn)在我就來深入研究一下這里面的各個函數(shù)及其用法2011-01-01PHP 雜談《重構(gòu)-改善既有代碼的設(shè)計》之二 對象之間搬移特性
承接上文PHP 雜談《重構(gòu)-改善既有代碼的設(shè)計》之 重新組織你的函數(shù) ,繼續(xù)說重構(gòu)方面的內(nèi)容2012-04-04Win2003下IIS+PHP+MySQL+Zend配置步驟詳解
Win2003下IIS+PHP+MySQL+Zend配置步驟詳解...2007-05-05php調(diào)用云片網(wǎng)接口發(fā)送短信的實現(xiàn)方法
這篇文章主要介紹了php調(diào)用云片網(wǎng)接口發(fā)送短信的實現(xiàn)方法的相關(guān)資料,希望通過本文能幫助到大家,讓大家實現(xiàn)這樣的功能,需要的朋友可以參考下2017-10-10