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
<?php
02
class BookSax{
03
	var $current_data = array();
04
	function start_element($parser, $name, $attrs){
05
		//checking interest node and setting need data
06
		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 data 
18
		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 data
23
			$this->current_data = array();
24
		}
25
	}
26
	function text($parser, $text){
27
		//collecting need data
28
		if(!empty($this->get_data)){
29
			$this->current_data[$this->get_data] = $text;
30
			$this->get_data = NULL;
31
		}
32
	}
33
}
34
 
35
//create parser
36
$book_sax = new BookSax();
37
$parser = xml_parser_create();
38
 
39
//set parser's option
40
xml_set_object ($parser, $book_sax);
41
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false);
42
 
43
//set call back
44
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 file
49
	 while ($data = fread($fp, 4096)){
50
		 $this_chunk_parsed = xml_parse($parser, $data, feof($fp));//do parse data and excute callback
51
		 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:
result

code here: source

Leave a Reply