今天繼續xml學習,主要是:SimpleXML快速解析文檔、xml與數組相互轉換 。博客中只是簡單的做一個學習記錄、積累。更加詳細的使用方法,可以查看php手冊
1、SimpleXML快速解析文檔
前面的三篇博客中提到的主要是DOM解析XML文檔,我們在使用的過程中可以明顯的感覺到DOM解析雖然很強大,但是步驟繁瑣。下面我們說一種相對簡單的XML解析,
SimpleXML解析xml文件非常簡單,因為它一次性把xml文件解析成一個對象
還是和以前一樣,程序中的代碼注釋進行了詳細的說明
1 <?php 2 /** 3 * 37集、用SimpleXML快速解析文檔 4 * 知識點:1、SimpleXML 5 * 2、Xpath 6 * SimpleXML解析xml文件非常簡單,因為它一次性把xml文件解析成一個對象 7 */ 8 // simplexml_load_file() 從文件載入xml文檔 9 $simxml = simplexml_load_file('./37.xml');10 // 輸出這個對象,我們看到如圖1 所示的一個 SimpleXMLElement Object,11 // 可以看出SimpleXML將xml文件解析成了一個包含對象和數組的混合12 //print_r($simxml);13 14 // 找到 title 是 路遙-平凡的世界 并輸出15 echo $simxml->book[1]->title;16 echo '<br />';17 // 看看bookstore下有幾本書,可是使用simplexml下面的count()方法18 echo $simxml->count();19 // 如圖2 我們看到正確的得到了我們期望的結果20 echo '<br />';21 // 查看每本書中用幾個子元素22 23 $sons = $simxml->children();24 foreach ($sons as $key => $html' target='_blank'>value) {25 echo '分別有'.$value->count().'個子元素:'.$value->getName().'<br />';26 }27 28 ?>
輸出截圖
2、38集、xml與數組相互轉換
1 <?php 2 /** 3 * 4 * @authors wxb (http://www.cnblogs.com/wxb0328/) 5 * @date 2014-10-06 23:00:19 6 * 7 * 38集、xml與數組相互轉換 8 * 9 */ 10 11 $simxml = simplexml_load_file('./38.xml'); 12 13 //print_r($simxml); 14 /** 15 * 上面的是37集中開頭SimpleXML解析開頭說過的,我們可以看到SimpleXML的解析,一個SimpleXMLElement Object, 16 * 對象中既有對象又有數組。比較混亂,一會使用->,一會又使用[],不利于我們運用,現在將其轉換為數組 17 */ 18 /** 19 * 現在我們考慮怎樣轉換? 20 * 我們可以看到: 21 * 對象,用 屬性名->屬性值 存儲變量 22 * 用 對象名->屬性名 調用變量值 23 * 數組,用 鍵名 => 鍵值 存儲變量 24 * 用 數組[鍵名] 調用變量值 25 * 我們完全可以將一個對象看成 一個關聯數組 26 * 有了上面的理解,我們這個xml轉數組就有了思路 27 * 1、我們先使用array 強制轉換對象為數組,但是強制轉換無法只能的將你的對象中的對象再轉為數組,它只能夠轉換當前給定的數組 28 * 2、基于1的分析,我們考慮寫一個方法,這個方法就是將對象強制轉換為數組 29 * 3、在這個方法中我們使用is_array() 判斷 如果是數組就不用轉換,如果不是數組就轉換 30 * 4、然后我們遞歸的調用這個方法 31 * 好了,思路有了!現在開始做 32 */ 33 function XmlToArr($simpleXml) { 34 /* 35 這里是十八哥在視屏中的實例,如圖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 * 在十八個的實例中我發現,我發現我們要判斷并且轉換的不光是xml的對象,在數組的情況下也需要查看數組是否是二維的, 45 * 如果是二維數組我們也需要繼續遞歸調用方法,轉換。 46 * 看到這里,我們上面的的思路3就是有錯誤的,我們不能只是簡單的判斷是數組就不轉化了,但是,我們可以這樣做,當這個 47 * 數組是一維數組的時候,就不需要轉化了,但是怎樣判斷這個數組是一維數組? 48 * 雖然這里是可以用程序判斷的,但是要自己寫,php并沒有提供特定的函數方法。 49 * 但是我們可以發現,當時一維數組時,數組能的值都是標量: 50 * 標量變量是指那些包含了 integer、float、string 或 boolean的變量,而 array、object 和 resource 則不是標量。 51 * 基于這個思路,修改函數如下: 52 * 判斷如果是一個標量,此時我們已經到了一個數組的值的部分,那我們返回這個值給遞歸調用里面的$arr[$key]($arr[$key] = XmlToArr($value);) 53 */ 54 if(is_scalar($simpleXml)) { 55 return $simpleXml; 56 }else { 57 //如果不是標量,那此時這個$simpleXml 肯定是array、object 和 resource 其中一個,但是在xml中不可能是resource了 58 // 無論你是array還是object,統統強制轉化 59 $arr = (array) $simpleXml; 60 // 循環這個數組,然后遞歸調用這個海曙 61 foreach ($arr as $key => $value) { 62 $arr[$key] = XmlToArr($value); 63 } 64 } 65 66 return $arr; 67 } 68 // 輸出到頁面,我們可以看到如圖4,結果是完全一樣的 69 print_r(XmlToArr($simxml)); 70 71 /***************************************************** 72 現在我們再將數組轉化為xml 73 *****************************************************/ 74 // 首先我們定義這個數組 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 // 數組轉化為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抱錯了(如圖5),原因是xml的標簽,節點不能以數字開頭 99 下面我們簡單的做個判斷,然后是數字的我們給拼接一個字母前綴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 如果要運行上面的程序,請將兩部分分開運行(可以先注釋掉其中的某個部分)120 ******************************************/121 ?>
圖3
圖4
圖5
圖6
好了,這篇就先這么多吧,代碼中的注釋很關鍵,由于沒有將每一次運行的代碼都寫入到新的文件,都是先編寫一部分,完成以后,再注釋掉,所以大家在看的時候,一定
要仔細看代碼的注釋,
也不是我這人太爛,只是相同的說明,沒有必要在寫博客的時候再提出來,既然都是干這個的,我相信大家都是有看注釋的習慣的。而我就在寫代碼的時候把注釋盡量寫的
詳細點,這樣,寫博客時我也能節省點時間,畢竟周末時間是寶貴的呀!
雖然只是一點學習筆記,但是我覺得總是可以幫助到一些人,而且把東西分享出來,給別人開的東西也不能太差。就是這樣的想法,我在學習的時候可能會更加用心。需要
學習的東西還有很多,沒有辦法做更多的深入的研究。這些筆記就算是xml的入門吧,以后工作中再去了解更多的xml的東西。
PHP編程鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答