本文實(shí)例講述了PHP4和PHP5版本下解析XML文檔的操作方法。分享給大家供大家參考,具體如下:
在PHP網(wǎng)站開(kāi)發(fā)與建設(shè)過(guò)程中,時(shí)常會(huì)碰到需要對(duì)XML文檔進(jìn)行解析,PHP4版本自帶了XML解析器(sax),PHP5版本增加了SimpleXML(基于dom)的XML擴(kuò)展,對(duì)XML的解析更是非常方便,今天和大家分享下在不同環(huán)境下對(duì)XML文檔進(jìn)行解析的方法。
XML文檔
<?xml version="1.0" encoding="gbk"?> <LeapsoulXML> <LeapsoulInfo> <name>Leapsoul-PHP網(wǎng)站開(kāi)發(fā)</name> <website>http://www.jb51.net</website> <description>分享PHP網(wǎng)站開(kāi)發(fā)與建設(shè)的樂(lè)趣,教你如何建立網(wǎng)站</description> <bloger>David</bloger> <date>2009-05-13</date> <qq>QQ:154130270</qq> </LeapsoulInfo> <LeapsoulInfo> <name>Leapsoul-PHP網(wǎng)站開(kāi)發(fā)</name> <website>http://www.jb51.net</website> <description>分享PHP網(wǎng)站開(kāi)發(fā)與建設(shè)的樂(lè)趣,教你如何建立網(wǎng)站</description> <bloger>David</bloger> <date>2009-05-13</date> <qq>QQ:154130270</qq> </LeapsoulInfo> </LeapsoulXML>
PHP5版本下SimpleXML的使用方法
$info=simplexml_load_file('leapsoulcn.xml'); print_r($info); $name=$info->LeapsoulInfo[0]->name; echo$name; foreach($info->LeapsoulInfoas$LeapsoulInfo) { echo$LeapsoulInfo->name."<br />"; echo$LeapsoulInfo->website."<br />"; echo$LeapsoulInfo->description."<br />"; echo$LeapsoulInfo->bloger."<br />"; echo$LeapsoulInfo->date."<br />"; echo$LeapsoulInfo->qq."<br />"; } foreach($info->xpath('//name')as$value){ echo$value.'<br />'; } foreach($info->LeapsoulInfo[0]->children()as$value){ echo$value->getName(); echo$value.'<br />'; } $info->LeapsoulInfo[0]->addChild('msn','MSN:davidfaithman@hotmail.com'); $info->asXML('leapsoulcn.xml');
代碼注釋
第1行:simplexml_load_file:讀取一個(gè)xml文檔作為操作對(duì)象,可以讀取本地或者遠(yuǎn)程xml文檔;simplexml_load_string:讀取一個(gè)xml字符串作為操作的對(duì)象
第3行:如果不清楚如何獲取某個(gè)節(jié)點(diǎn)的信息,可用print_r函數(shù)打印輸出查看具體的結(jié)構(gòu),simplexml解析返回的對(duì)象具有數(shù)組結(jié)構(gòu)。
第5~8行:以對(duì)象方式讀取某個(gè)XML文檔節(jié)點(diǎn)信息,讀取方式:句柄->節(jié)點(diǎn)元素名->子節(jié)點(diǎn),如果相同的節(jié)點(diǎn)元素有多個(gè),則以數(shù)組(array)方式讀取
注:由于simplexml解析返回的信息是UTF8格式的,如果網(wǎng)站使用的是GBK的,則需要轉(zhuǎn)碼,你可以使用iconv函數(shù)或者其他的utf8與gbk轉(zhuǎn)換函數(shù)進(jìn)行操作,如:$name = iconv('utf-8′,'gbk',$name);
第9~17行:以遍歷的形式,讀取所有元素下的子節(jié)點(diǎn)信息
第19~21行:simplexml的xpath函數(shù)是用來(lái)查詢(xún)XML數(shù)據(jù)的,比如這里查詢(xún)的是所有name節(jié)點(diǎn)的值
第23~26行:children函數(shù)是用來(lái)找尋某個(gè)特定節(jié)點(diǎn)下所有子節(jié)點(diǎn)的值。getName函數(shù)用來(lái)獲得每個(gè)子節(jié)點(diǎn)的元素名稱(chēng)
第28~29行:addChild函數(shù)用來(lái)在某個(gè)特定節(jié)點(diǎn)下增加一個(gè)子節(jié)點(diǎn);asXML函數(shù)對(duì)已做過(guò)改動(dòng)的XML文檔進(jìn)行保存
點(diǎn)擊查看更多SimpleXML函數(shù)說(shuō)明。
PHP4版本自帶的XML函數(shù)解析方法
function doStartElement($xmlParser,$name,$attr) { //對(duì)開(kāi)始元素的處理 } function doEndElement($xmlParser,$name) { //對(duì)結(jié)尾元素的處理 } function doStringData($xmlParser,$data) { //對(duì)元素間的字符數(shù)據(jù)的處理 } $xmlObj = xml_parser_create("UTF-8"); xml_set_element_handler($xmlObj,"doStartElement","doEndElement"); xml_set_character_data_handler($xmlObj,"doStringData"); xml_parse($xmlObj,file_get_contents("leapsoulcn.xml")); xml_parser_free($xmlObj);
代碼注釋
第1~15行:定義開(kāi)始元素,結(jié)尾元素以及元素間字符數(shù)據(jù)的處理函數(shù)
第16行:建立一個(gè)新的XML解析器并返回可被其它XML函數(shù)使用的資源句柄,輸入默認(rèn)編碼方式為 “ISO-8859-1”。同時(shí),支持的編碼方式還有“UTF-8”和 “US-ASCII”,輸出數(shù)據(jù)編碼方式是和xml_parser_create函數(shù)處定義相一致。
第18行:建立起始和終止元素處理器
第20行:建立字符數(shù)據(jù)處理器,處理元素之間的相關(guān)數(shù)據(jù)
注:XML語(yǔ)法解析器不會(huì)加上或者去掉任何空格,空格的取舍將由開(kāi)發(fā)者自己決定。
第22行:?jiǎn)?dòng)解析器xml_parse函數(shù)第二個(gè)參數(shù)是字符型的,所以需要讀取相關(guān)的XML文檔信息,此處我用的是file_get_contents函數(shù),本地遠(yuǎn)程都可行,當(dāng)然你也可以使用fopen函數(shù)
第24行:XML解析完成后,釋放解析器占用的內(nèi)存
自帶的XML函數(shù)解析思路