thaiall logomy background

คำสำคัญ : xmldata php

my town
กฤษฎา ตันเปาว์ | จริยธรรมสำหรับผู้บริหาร | วิจัยคืออะไร | ศูนย์สอบ | KM | SWOT | คำสำคัญ
15. ตัวอย่างโปรแกรมอ่านข้อมูลจากแฟ้ม xml ภายนอก (xmldata.php)
แฟ้มที่อยู่ในรูปแบบ XML เริ่มเกี่ยวข้องกับชีวิตเราเพิ่มขึ้น เห็นตัวอย่างการเผยแพร่ที่รัฐบาล ทำเว็บไซต์เผยแพร่ข้อมูล ผ่าน data.go.th (ข้อมูลสุขภาพรายจังหวัด) มีชุดข้อมูลเมื่อสิงหาคม 2560 แล้วจำนวนกว่า 908 ชุดข้อมูล มีรูปแบบ XML จำนวน 77 ชุดข้อมูล หรือ ที่ truehits.net เผยแพร่สถิติ Top 10 ในแต่ละ category ก็เผยแพร่ผ่าน XML เช่นกัน ที่ truehits.net หรือ อัตราแลกเปลี่ยน ที่เผยแพร่โดยธนาคารแห่งประเทศไทย ที่ bot.or.th นอกจากข้อมูลที่เราคุ้นเคย อาจแสดงเป็นตาราง (Table) แถว (Row) หรือ คอลัม (Column) ปัจจุบันเริ่มมีข้อมูลแบบ JSON พบใน data.go.th เช่นกัน และ เริ่มได้รับความนิยมไล่ตาม XML มาติดติด
ปล. ตัวอย่างนี้ lock ไว้ ให้อ่านเฉพาะแฟ้ม education.xml หรือ employee.xml นะครับ แต่ปรับแก้ได้
<?php
/*
Script_name : xmldata.php
Source_code : http://www.thaiall.com/xml/
Version 2.2560-08-21
###########################
Update Description
- ปรับให้ทำงานกับทั้ง education.xml ที่ได้จาก truehits.net  และ ผ่าน url กับ entertain.xml
- ปรับให้ทำงานกับ employees.xml ที่สร้างขึ้นเอง http://www.thaiall.com/xml/employees.xml
- ทดสอบบน Xampp 3.2.2 เมื่อ 21 สิงหาคม 2560 สามารถใช้งานได้ทั้ง 3 กรณี
http://localhost/xmldata.php?file=education.xml (ข้อมูลจาก truehits.net)
http://localhost/xmldata.php?file=employees.xml (สร้างขึ้นมาเพื่อทดสอบ)
http://localhost/xmldata.php?file=http://truehits.net/xml/entertain.xml
########################### */
/* Section 1 : Configuration */
if(isset($_REQUEST["file"])) $file_name = $_REQUEST["file"];
if(!isset($file_name) || strlen($file_name) < 4) { $file_name = "employees.xml"; }
$total_column = 999;		# เก็บจำนวน column ใน endElement ที่กำหนด 999 เพราะรองแรกไม่รู้จำนวน แต่ต้องใช้
$cnt_working_col = 1;		# ใช้นับ column ในแต่ละระเบียน จึง reset
$count_record = 0;			# ใช้นับ record ทั้งหมด
$count_column = 0;			# ใช้นับจำนวน column ทั้งหมด
$last_field = null; 		# สำหรับตรวจ last field
$xml_name = array();
/* Section 2 : Main Process */

if (!in_array($file_name, array("education.xml", "employees.xml"))) {
	die("Filename : limited");
}
if (!(list($xml_parser, $handle) = new_xml_parser($file_name))) {
	die("Could not open XML file");
}
// while ($read_data = fread($handle, filesize($file_name))) { // filesize ใช้กับ fopen จาก url ไม่ได้
while ($read_data = fread($handle, 8192)) {	
	if (!xml_parse($xml_parser, $read_data, feof($handle))) {
		die(sprintf("XML error: %s at line %dn",
		xml_error_string(xml_get_error_code($xml_parser)),
		xml_get_current_line_number($xml_parser)));
	}
}
print_data();
xml_parser_free($xml_parser);
/* Section 3 : Function Stock */
function print_data () {
	global $count_column, $count_record, $data, $xml_name, $data_attribs;	
	echo "<pre>[ record: $count_record column: ". ($count_column - 2) ."] \n"; 
	// หากนับเฉพาะตัวข้อมูล ก็จะไม่นับ <employee> กับ  <empl> จึงลบจำนวน $count_column ออกไป 2 ก็จะเหลือ 3
	// ที่ข้อมูลแสดงมา 4 column เพราะนำ attribute department ของ <empl> มาแสดง
	if(isset($data_attribs[0])) {
		// ใช้กรณีมี attribs ตั้งแต่ column แรก มีตัวอย่างใน education.xml
		for($i=0;$i<=count($data_attribs);$i++) { 
			echo $data_attribs[0][$i] . "\n";	
		}
	}
	for ($i=1;$i<count($xml_name);$i++) { echo " [ $xml_name[$i] ] "; }
	echo "<br/>";
	for ($i=1;$i<=$count_record;$i++) {
		// ใช้กรณีมี attribs ใน column ที่คุมระเบียน  หรือ ก่อนเข้า field
		if(isset($data_attribs[$i][0])) echo $data_attribs[$i][0]; else echo "null";
		echo " | "; // department
		for ($j=1;$j<$count_column;$j++) { 
			if(isset($data[$i][$j])) echo $data[$i][$j]. " : "; 
		}
		echo "\n";
	}
}
// เข้าฟังก์ชันนี้ เมื่อพบการเปิด <Tag ..> เปิดเท่าใดก็เรียกใช้เท่านั้น 
function startElement($parser, $name, $attribs) {
	global $count_column,$count_record,$xml_name,$last_field,$data_attribs,$total_column;
	if (isset($xml_name[0]) && (!isset($xml_name[1]) || $xml_name[1] == $name)) {
		$count_record++; // สำหรับนับ record
	}		
	if (count($attribs) > 0) { // ถ้ามี attribs ก็จะเก็บข้อมูลไว้เรียกใช้ภายหลัง
		$cnt_attribs = 0;
		foreach($attribs as $key => $value) { 
			$data_attribs[$count_record][$cnt_attribs++] = "$key:$value"; 	// department:sale
		}	
	}	
	if ($last_field == null ) {
		if(!in_array($name,$xml_name)) {
			$xml_name[$count_column] = $name;		
			$count_column = $count_column + 1; // สำหรับนับ column
		}
	}
	if (isset($xml_name[1]) && $xml_name[1] == $name && $count_column > $total_column) {
		$last_field = $name;
	}
}
// เข้าฟังก์ชันนี้ เมื่อพบการปิด </Tag> ปิดเท่าใดก็เรียกใช้เท่านั้น
function endElement($parser, $name) {
	global $xml_name,$cnt_working_col,$total_column;
	if ($name == $xml_name[1]) {
		$total_column = $cnt_working_col; // บันทึกจำนวน column ที่มากที่สุด คือ จำนวน column
		$cnt_working_col = 1; // บันทึกว่าปัจจุบันทำงาน columnn ที่เท่าใด เริ่ม reset ใหม่เมื่อปิด Tag
	}
}
// เข้าฟังก์ชันนี้ หลังเปิด  หรือ หลังปิด Tag แต่หยุดเข้าหลังปิด Tag ตัวสุดท้าย
function characterData($parser, $read_data) {
	global $data,$count_record,$cnt_working_col;
	if (strlen($read_data) > 1) {
		$data[$count_record][$cnt_working_col++] = $read_data;
	}
}
function new_xml_parser($file_name) {
	global $parser_file;
	$xml_parser = xml_parser_create(); // ผู้แยกคำ = parser
	xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0);
	xml_set_element_handler($xml_parser, "startElement", "endElement");
	xml_set_character_data_handler($xml_parser, "characterData");
	if (!($handle = @fopen($file_name, "r"))) { return false; }
	if (!is_array($parser_file)) { settype($parser_file, "array"); }
	$parser_file[$xml_parser] = $file_name;
	return array($xml_parser, $handle);	
}
?>
Dir : xml File : index.html Topic : xmldata_php

Reset | Decode | ZUcxcw== | YVc1a1pYZ3VhSFJ0YkE9PQ==
คุณคิดอะไรอยู่
Thaiall.com