一、SAX,也就是simple API for XML,XML的簡單應用介面
具體步驟:①建立XML解析器,使用xml_parser_create函數,參數是編碼,傳回值是對應的解析器資源
②建立解析處理函數,分別處理開始標籤、結束標籤、資料,設定標籤的處理函數為xml_set_element_handler,三個參數,第一個是解析器資源,第二個是處理開始標籤的函數名,第二個是處理結束標籤的函數名;設定處理資料的函數為xml_set_character_data_handler,兩個參數,第一個是解析器資源,第二個是處理資料的函數名;在這裡定義的三個自訂函數是需要自己去實現的
③開始解析,xml_parse,三個參數,第一個是解析器資源,第二個是要處理的內容,這裡的內容要求是字串形式的,所以可以是通過file_get_contents函數讀取檔案得到的字串,第三個參數設定為true的話,就是告訴解析器,當前已經是最後一個資料了,否則解析器就會繼續等待,而不會認為是處理完畢,所以要得到錯誤,就需要設定為true,解析器處理完後知道後面沒有要處理的資料了,就能判斷有沒有錯誤,有錯誤就會拋出
④出現錯誤如何處理,xml_get_error_code,xml_get_current_line_number,xml_get_current_column_number,分別是獲得錯誤碼、獲得錯誤所在行、獲得錯誤所在列,參數都是解析器資源,還有一個xml_error_string獲得錯誤資訊,這個參數有點不一樣,是以xml_get_error_code的傳回值作為參數
這個方式的優缺點(相對於DOM方式):
①DOM需要將所有資料讀取到記憶體,並將節點處理好之後再操作,SAX是讀取一個,操作一個,釋放一個
②當xml文檔結構有錯誤時,DOM沒有辦法解析成DOM樹,而SAX可以操作,直到發生錯誤的地方
③SAX只能讀取資料,而DOM能做很多複雜的操作,SAX處理速度快,適合大文檔
二、simpleXML,這是php專門提供的一種簡單處理xml的方式,它將xml資料在記憶體中形成對象集合,相同層級的對象會轉換成數組,操作起來很容易
步驟:①執行個體化一個SimpleXMLElement對象,參數是通過file_get_contents得到的字串,此時獲得的對象就相當於是xml文檔的根項目,$sxe = new SimpleXMLElement($string);
②訪問節點$sxe->book->title;,要訪問一個節點,直接通過根節點指到下一個子節點,再一直指到要訪問的節點即可,得到節點對象,可以直接使用echo輸出節點裡面的資料,因為對象中有一個類似__tostring的方法,還能以數組的方式訪問,$sxe->book[2]->title,或者直接遍曆foreach($sxe->book as $book){echo $book->title}
③增加節點$sxe->addChild('book', 'abcd'),參數分別是節點名、節點值,用這個方法可以在任意節點裡面增加子節點
④增加屬性:$book->addAttribute('id', 'book10')
⑤刪除節點:unset($sxe->book[2]);
⑥更新節點:找到節點後直接賦值即可
④儲存xml檔案:$sxe->asXML('book.xml'); 參數是檔案名稱
SimpleXMLElement對象與DOM對象的相互轉換:
1、將dom轉換成SimpleXMLElement:直接使用函數$sxe = simple_import_dom($doc); 其中$doc是要轉換的dom對象
2、將SimpleXMLElement對象轉換成dom對象:$root = dom_import_simplexml($sxe);現在得到的只是節點,因為$sxe本身就是相當於xml文檔的根項目對象嘛,所以我們還需要建立dom樹,然後將節點和樹聯絡上:①$doc = new DOMDocument('1.0', 'utf-8'); ②$domelement = $doc->importNode($root, true),這裡的true很重要,不設定的話,就只是將根項目節點對象放到dom樹上了,用true表示遞迴的將所有節點都放到dom樹上, ③$doc->appendChild($domelement); ④$doc->save('book.xml');