DOM & SAX
หลายคนที่เคยโปรแกรมเกี่ยวกับขู้อมูลที่เป็นลักษณะ XML คงจะรู้จัก DOM กันมาบ้างแล้ว
DOM (Document Object Model) คือวิธีจัดการกับ XML อย่างหนึ่งโดย แทน node ต่างๆใน file ด้วย object ทำให้การเข้าถึง node ต่างๆทำได้ง่ายขึ้น โดยการใช้ method ของ object แต่การจะสร้าง object จาก XML จะต้อง parse XML ทั้งหมดลง memory ทำให้วิธีนี้ไม่เหมาะที่จะใช้กับ file XML ที่มีขนาดใหญ่ ถ้าไม่เชื่อลองได้โดยเอา XML ขนาด 10 MB ไปเปิดกับ browser อย่าง IE หรือ firefox ดูเพราะ browser ทั่วไปใช้ DOM จัดการกับ file ลักษณะ XML อยู่แล้ว ฉะนั้นจึงมีอีกวิธีหนึ่งที่จัดการกับ XML นั้นก็คือ SAX
SAX (Simple API for XML) เป็นวิธีการจัดการ XML โดย access แต่ละ node ไปตามลำดับ จนจบ file โดยจะใช้ event จัดการกับแต่ละ node event ของ SAX ประกอบไปด้วย
- Processing Instruction (ส่วนที่ใช้ describe XML: )
- Element nodes (แบ่งเป็น 2 eventคือ start element, end element)
- Text nodes
- Comments
ตัวอย่างการใช้ SAX กับ php
Sample xml:books.xml
sample php code:
01 <?php02 class BookSax{03 var $current_data = array();04 function start_element($parser, $name, $attrs){05 //checking interest node and setting need data06 if($name == 'book'){07 $this->current_data['id'] = $attrs['id'];08 }09 if($name == 'title'){10 $this->get_data = 'title';11 }12 if($name == 'price'){13 $this->get_data = 'price';14 }15 }16 function end_element($parser, $name){17 //print data when get all boook's data18 if($name == 'book'){19 print '<strong>ID:</strong> '.$this->current_data['id']20 .' <strong>TITLE:</strong> '.$this->current_data['title']21 .' <strong>PRICE:</strong> '.$this->current_data['price'].'<br/>';22 //clear previous boook's data23 $this->current_data = array();24 }25 }26 function text($parser, $text){27 //collecting need data28 if(!empty($this->get_data)){29 $this->current_data[$this->get_data] = $text;30 $this->get_data = NULL;31 }32 }33 }34 35 //create parser36 $book_sax = new BookSax();37 $parser = xml_parser_create();38 39 //set parser's option40 xml_set_object ($parser, $book_sax);41 xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false);42 43 //set call back44 xml_set_element_handler($parser,"start_element","end_element");45 xml_set_character_data_handler($parser, "text");46 47 if($fp = fopen('books.xml', "r")){48 //read xml file49 while ($data = fread($fp, 4096)){50 $this_chunk_parsed = xml_parse($parser, $data, feof($fp));//do parse data and excute callback51 if (!$this_chunk_parsed) {52 $error_code = xml_get_error_code($parser);53 $error_text = xml_error_string($error_code);54 $error_line = xml_get_current_line_number($parser);55 $output_text = "Parsing problem at line $error_line: $error_text";56 die($output_text);57 }58 }59 }60 fclose($fp);61 xml_parser_free($parser);62 ?>
result here:

code here: source