今天繼續(xù)xml學(xué)習(xí),主要是:SimpleXML快速解析文檔、xml與數(shù)組相互轉(zhuǎn)換 。博客中只是簡(jiǎn)單的做一個(gè)學(xué)習(xí)記錄、積累。更加詳細(xì)的使用方法,可以查看php手冊(cè)
1、SimpleXML快速解析文檔
前面的三篇博客中提到的主要是DOM解析XML文檔,我們?cè)谑褂玫倪^(guò)程中可以明顯的感覺(jué)到DOM解析雖然很強(qiáng)大,但是步驟繁瑣。下面我們說(shuō)一種相對(duì)簡(jiǎn)單的XML解析,
SimpleXML解析xml文件非常簡(jiǎn)單,因?yàn)樗淮涡园褁ml文件解析成一個(gè)對(duì)象
還是和以前一樣,程序中的代碼注釋進(jìn)行了詳細(xì)的說(shuō)明
1 <?php 2 /** 3 * 37集、用SimpleXML快速解析文檔 4 * 知識(shí)點(diǎn):1、SimpleXML 5 * 2、Xpath 6 * SimpleXML解析xml文件非常簡(jiǎn)單,因?yàn)樗淮涡园褁ml文件解析成一個(gè)對(duì)象 7 */ 8 // simplexml_load_file() 從文件載入xml文檔 9 $simxml = simplexml_load_file('./37.xml');10 // 輸出這個(gè)對(duì)象,我們看到如圖1 所示的一個(gè) SimpleXMLElement Object,11 // 可以看出SimpleXML將xml文件解析成了一個(gè)包含對(duì)象和數(shù)組的混合12 //print_r($simxml);13 14 // 找到 title 是 路遙-平凡的世界 并輸出15 echo $simxml->book[1]->title;16 echo '<br />';17 // 看看bookstore下有幾本書(shū),可是使用simplexml下面的count()方法18 echo $simxml->count();19 // 如圖2 我們看到正確的得到了我們期望的結(jié)果20 echo '<br />';21 // 查看每本書(shū)中用幾個(gè)子元素22 23 $sons = $simxml->children();24 foreach ($sons as $key => $html' target='_blank'>value) {25 echo '分別有'.$value->count().'個(gè)子元素:'.$value->getName().'<br />';26 }27 28 ?>輸出截圖

2、38集、xml與數(shù)組相互轉(zhuǎn)換
1 <?php 2 /** 3 * 4 * @authors wxb (http://www.cnblogs.com/wxb0328/) 5 * @date 2014-10-06 23:00:19 6 * 7 * 38集、xml與數(shù)組相互轉(zhuǎn)換 8 * 9 */ 10 11 $simxml = simplexml_load_file('./38.xml'); 12 13 //print_r($simxml); 14 /** 15 * 上面的是37集中開(kāi)頭SimpleXML解析開(kāi)頭說(shuō)過(guò)的,我們可以看到SimpleXML的解析,一個(gè)SimpleXMLElement Object, 16 * 對(duì)象中既有對(duì)象又有數(shù)組。比較混亂,一會(huì)使用->,一會(huì)又使用[],不利于我們運(yùn)用,現(xiàn)在將其轉(zhuǎn)換為數(shù)組 17 */ 18 /** 19 * 現(xiàn)在我們考慮怎樣轉(zhuǎn)換? 20 * 我們可以看到: 21 * 對(duì)象,用 屬性名->屬性值 存儲(chǔ)變量 22 * 用 對(duì)象名->屬性名 調(diào)用變量值 23 * 數(shù)組,用 鍵名 => 鍵值 存儲(chǔ)變量 24 * 用 數(shù)組[鍵名] 調(diào)用變量值 25 * 我們完全可以將一個(gè)對(duì)象看成 一個(gè)關(guān)聯(lián)數(shù)組 26 * 有了上面的理解,我們這個(gè)xml轉(zhuǎn)數(shù)組就有了思路 27 * 1、我們先使用array 強(qiáng)制轉(zhuǎn)換對(duì)象為數(shù)組,但是強(qiáng)制轉(zhuǎn)換無(wú)法只能的將你的對(duì)象中的對(duì)象再轉(zhuǎn)為數(shù)組,它只能夠轉(zhuǎn)換當(dāng)前給定的數(shù)組 28 * 2、基于1的分析,我們考慮寫(xiě)一個(gè)方法,這個(gè)方法就是將對(duì)象強(qiáng)制轉(zhuǎn)換為數(shù)組 29 * 3、在這個(gè)方法中我們使用is_array() 判斷 如果是數(shù)組就不用轉(zhuǎn)換,如果不是數(shù)組就轉(zhuǎn)換 30 * 4、然后我們遞歸的調(diào)用這個(gè)方法 31 * 好了,思路有了!現(xiàn)在開(kāi)始做 32 */ 33 function XmlToArr($simpleXml) { 34 /* 35 這里是十八哥在視屏中的實(shí)例,如圖3 36 $arr = (array) $simpleXml; 37 foreach ($arr as $key => $value) { 38 if($value instanceof SimpleXMLElement || is_array($value)){ 39 $arr[$key] = XmlToArr($value); 40 } 41 } 42 */ 43 /* 44 * 在十八個(gè)的實(shí)例中我發(fā)現(xiàn),我發(fā)現(xiàn)我們要判斷并且轉(zhuǎn)換的不光是xml的對(duì)象,在數(shù)組的情況下也需要查看數(shù)組是否是二維的, 45 * 如果是二維數(shù)組我們也需要繼續(xù)遞歸調(diào)用方法,轉(zhuǎn)換。 46 * 看到這里,我們上面的的思路3就是有錯(cuò)誤的,我們不能只是簡(jiǎn)單的判斷是數(shù)組就不轉(zhuǎn)化了,但是,我們可以這樣做,當(dāng)這個(gè) 47 * 數(shù)組是一維數(shù)組的時(shí)候,就不需要轉(zhuǎn)化了,但是怎樣判斷這個(gè)數(shù)組是一維數(shù)組? 48 * 雖然這里是可以用程序判斷的,但是要自己寫(xiě),php并沒(méi)有提供特定的函數(shù)方法。 49 * 但是我們可以發(fā)現(xiàn),當(dāng)時(shí)一維數(shù)組時(shí),數(shù)組能的值都是標(biāo)量: 50 * 標(biāo)量變量是指那些包含了 integer、float、string 或 boolean的變量,而 array、object 和 resource 則不是標(biāo)量。 51 * 基于這個(gè)思路,修改函數(shù)如下: 52 * 判斷如果是一個(gè)標(biāo)量,此時(shí)我們已經(jīng)到了一個(gè)數(shù)組的值的部分,那我們返回這個(gè)值給遞歸調(diào)用里面的$arr[$key]($arr[$key] = XmlToArr($value);) 53 */ 54 if(is_scalar($simpleXml)) { 55 return $simpleXml; 56 }else { 57 //如果不是標(biāo)量,那此時(shí)這個(gè)$simpleXml 肯定是array、object 和 resource 其中一個(gè),但是在xml中不可能是resource了 58 // 無(wú)論你是array還是object,統(tǒng)統(tǒng)強(qiáng)制轉(zhuǎn)化 59 $arr = (array) $simpleXml; 60 // 循環(huán)這個(gè)數(shù)組,然后遞歸調(diào)用這個(gè)海曙 61 foreach ($arr as $key => $value) { 62 $arr[$key] = XmlToArr($value); 63 } 64 } 65 66 return $arr; 67 } 68 // 輸出到頁(yè)面,我們可以看到如圖4,結(jié)果是完全一樣的 69 print_r(XmlToArr($simxml)); 70 71 /***************************************************** 72 現(xiàn)在我們?cè)賹?shù)組轉(zhuǎn)化為xml 73 *****************************************************/ 74 // 首先我們定義這個(gè)數(shù)組 75 76 77 $xmlArr = Array( 78 'title' => '路遙-平凡的世界', 79 'price' => 43, 80 'comment' => array( 81 0 => 'good book', 82 1 => 'very help', 83 2 => 'I think the book is best' 84 ) 85 ); 86 // 數(shù)組轉(zhuǎn)化為xml 方法 87 function arrToxml($arr,$node = null) { 88 if ($node === null) { 89 $sx = new SimpleXMLElement("<?xml version='1.0' encoding='utf-8' ?><bookstore></bookstore>"); 90 }else{ 91 $sx = $node; 92 } 93 94 foreach ($arr as $key => $value) { 95 if (is_scalar($value)) { 96 /* 97 $sx->addChild($key,$value); 98 上面這種輸出雖然也成功的看到了,但是xml抱錯(cuò)了(如圖5),原因是xml的標(biāo)簽,節(jié)點(diǎn)不能以數(shù)字開(kāi)頭 99 下面我們簡(jiǎn)單的做個(gè)判斷,然后是數(shù)字的我們給拼接一個(gè)字母前綴100 成功輸出(如圖6)101 */102 103 if(is_numeric($key)) {104 $sx->addChild('comm_'.$key,$value);105 }else{106 $sx->addChild($key,$value);107 }108 109 }else {110 $tmpNode = $sx->addChild($key);111 arrToxml($value,$tmpNode);112 }113 }114 return $sx->saveXML();115 }116 header("content-type:text/xml");117 echo arrToxml($xmlArr);118 /******************************************119 如果要運(yùn)行上面的程序,請(qǐng)將兩部分分開(kāi)運(yùn)行(可以先注釋掉其中的某個(gè)部分)120 ******************************************/121 ?>
圖3

圖4

圖5

圖6
好了,這篇就先這么多吧,代碼中的注釋很關(guān)鍵,由于沒(méi)有將每一次運(yùn)行的代碼都寫(xiě)入到新的文件,都是先編寫(xiě)一部分,完成以后,再注釋掉,所以大家在看的時(shí)候,一定
要仔細(xì)看代碼的注釋,
也不是我這人太爛,只是相同的說(shuō)明,沒(méi)有必要在寫(xiě)博客的時(shí)候再提出來(lái),既然都是干這個(gè)的,我相信大家都是有看注釋的習(xí)慣的。而我就在寫(xiě)代碼的時(shí)候把注釋盡量寫(xiě)的
詳細(xì)點(diǎn),這樣,寫(xiě)博客時(shí)我也能節(jié)省點(diǎn)時(shí)間,畢竟周末時(shí)間是寶貴的呀!
雖然只是一點(diǎn)學(xué)習(xí)筆記,但是我覺(jué)得總是可以幫助到一些人,而且把東西分享出來(lái),給別人開(kāi)的東西也不能太差。就是這樣的想法,我在學(xué)習(xí)的時(shí)候可能會(huì)更加用心。需要
學(xué)習(xí)的東西還有很多,沒(méi)有辦法做更多的深入的研究。這些筆記就算是xml的入門吧,以后工作中再去了解更多的xml的東西。
PHP編程鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。
新聞熱點(diǎn)
疑難解答