今天工作上碰到一個(gè)問(wèn)題 由于我們的項(xiàng)目數(shù)據(jù)太少 所以需要從web search那邊借調(diào)數(shù)據(jù),他們只給我們提供了一個(gè)xml的接口。因此,我們需要把xml的數(shù)據(jù)轉(zhuǎn)化成html呈現(xiàn)給大家。由于項(xiàng)目是基于php的,所以就摒棄了用js來(lái)讀取xml選擇了繼續(xù)使用php。不過(guò),我以前從來(lái)沒(méi)有做過(guò)此類的嘗試 所以找了很多網(wǎng)上資料同時(shí)參照了php的工作手冊(cè),發(fā)現(xiàn)在php4的環(huán)境下 用parser函數(shù)是一個(gè)比較好的選擇(當(dāng)然也可以用dom 但是需要對(duì)服務(wù)器重新進(jìn)行配置 php5對(duì)dom支持得比較好)。
雖然以前沒(méi)有接觸過(guò)此類問(wèn)題,但是還是很快就解決了,不過(guò)在解決和摸索的過(guò)程中發(fā)現(xiàn)網(wǎng)上關(guān)于此類的資料雖然不少,但是參差不齊,很多描述不是很詳細(xì),還是操作手冊(cè)比較管用。
好了,言歸正傳:
parser是php內(nèi)置的一個(gè)用來(lái)處理xml的解析器,它的工作由三個(gè)事件組成:起始標(biāo)簽、 讀取數(shù)據(jù)、結(jié)束標(biāo)簽。
也就是說(shuō)在對(duì)xml進(jìn)行處理的時(shí)候每當(dāng)遇到起始標(biāo)簽、數(shù)據(jù)和結(jié)束標(biāo)簽的時(shí)候函數(shù)會(huì)做相應(yīng)的動(dòng)作來(lái)完成對(duì)xml數(shù)據(jù)的轉(zhuǎn)換。
php中對(duì)xml讀取的相關(guān)函數(shù)的介紹:
引用:
--------------------------------------------------------------------------------
對(duì)象 XML解析函數(shù) 描述 元素 xml_set_element_handler() 元素的開(kāi)始和結(jié)束 字符數(shù)據(jù) xml_set_character_data_handler() 字符數(shù)據(jù)的開(kāi)始 外部實(shí)體 xml_set_external_entity_ref_handler() 外部實(shí)體出現(xiàn) 未解析外部實(shí)體 xml_set_unparsed_entity_decl_handler() 未解析的外部實(shí)體出現(xiàn) 處理指令 xml_set_processing_instruction_handler() 處理指令的出現(xiàn) 記法聲明 xml_set_notation_decl_handler() 記法聲明的出現(xiàn) 默認(rèn) xml_set_default_handler() 其它沒(méi)有指定處理函數(shù)的事件
--------------------------------------------------------------------------------
下面就給大家舉一個(gè)小小的例子用parser函數(shù)來(lái)讀取xml數(shù)據(jù):
<?php $parser = xml_parser_create(); //創(chuàng)建一個(gè)parser編輯器 xml_set_element_handler($parser, "startElement", "endElement");//設(shè)立標(biāo)簽觸發(fā)時(shí)的相應(yīng)函數(shù) 這里分別為startElement和endElenment xml_set_character_data_handler($parser, "characterData");//設(shè)立數(shù)據(jù)讀取時(shí)的相應(yīng)函數(shù) $xml_file="1.xml";//指定所要讀取的xml文件,可以是url $filehandler = fopen($xml_file, "r");//打開(kāi)文件
while ($data = fread($filehandler, 4096)) { xml_parse($parser, $data, feof($filehandler)); }//每次取出4096個(gè)字節(jié)進(jìn)行處理
fclose($filehandler); xml_parser_free($parser);//關(guān)閉和釋放parser解析器
$name=false; $position=false; function startElement($parser_instance, $element_name, $attrs) //起始標(biāo)簽事件的函數(shù) { global $name,$position; if($element_name=="NAME") { $name=true; $position=false; echo "名字:"; } if($element_name=="POSITION") {$name=false; $position=true; echo "職位:"; } }
function characterData($parser_instance, $xml_data) //讀取數(shù)據(jù)時(shí)的函數(shù) { global $name,$position; if($position) echo $xml_data."<br>"; if($name) echo $xml_data."<br>"; }
function endElement($parser_instance, $element_name) //結(jié)束標(biāo)簽事件的函數(shù) { global $name,$position; $name=false; $position=false; }
?>
xml文件代碼如下:
<?xml version="1.0"?> <employees> <employee> <name>張三</name> <position age="45">經(jīng)理</position> </employee> <employees> <employee> <name>李四</name> <position age="45">助理</position> </employee> </employees>
這個(gè)程序的結(jié)果如下:
引用: --------------------------------------------------------------------------------
名字:張三 職位:經(jīng)理 名字:李四 職位:助理
--------------------------------------------------------------------------------
出處:藍(lán)色理想
責(zé)任編輯:moby
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|