XML คือ ภาษาสำหรับอธิบายข้อมูล และเก็บข้อมูลไปพร้อมกัน มีโครงสร้างคล้ายกับ HTML ซึ่งผู้สร้างข้อมูลกำหนด TAG เองได้ เช่น <WIFE> หรือ <Customer>
HTML คือ ภาษาสำหรับแสดงผลข้อมูล และแสดงข้อมูลอย่างไร ซึ่งมี TAG เป็นคำสั่งตายตัว เช่น <HTML> หรือ <IMG> เป็นต้น
XML (eXtensible Markup Language) คือ รูปแบบข้อมูลที่มีโครงสร้างที่เอื้อต่อการแลกเปลี่ยนข้อมูลในเครือข่ายอินเทอร์เน็ต ใช้รูปแบบที่ขยายจากภาษาเฮชทีเอ็มแอลสำหรับกำหนดวัตถุ เป็นมาตรฐานที่สอดคล้องตาม RFC 7303
การตั้งชื่อ TAG สามารถใช้เครื่องหมาย dash(-) หรือ underscore(_) หรือ dot (.) หรือ colon (:) แต่ dash ใช้เป็นอักษรแรกของ TAG ไม่ได้
XML (eXtensible Markup Language) is a data format for structured document interchange on the Web. It is a standard defined by The World Wide Web consortium (W3C). Information about XML and related technologies can be found at w3.org/XML
โปรแกรมนี้ (educationt.htm) ไม่แสดงผลตามปกติ เป็นเพราะรุ่นของ Browser ในอดีตเคยใช้งานโปรแกรมนี้ได้บน IE ที่ลด Security ของ Browser เป็น Low สำหรับกรณีนี้ - ผมเคยได้รับ e-mail จาก คุณศุภกิจ [pao@eng.kmitnb.ac.th] ทำให้ทราบว่าตัวอย่างนี้มีปัญหา คือ โหลดข้อมูล xml จากนอกเครื่อง (External) เข้าไปประมวลผลไม่ได้ แต่ถ้าทดสอบโปรแกรมบนเครื่องท้องถิ่นจะอ่านแฟ้ม xml จากที่ใดก็ได้ เมื่อทดสอบก็พบปัญหาเช่นกัน แต่พบวิธีแก้ไข คือ ปรับ option ใน IE หัวข้อ Security ให้เป็น Low (ie รุ่นใหม่ ต่ำสุดคือ Medium) เคยทดสอบติดตั้ง PWS แล้วเรียกใช้ จะมีการถามเรื่องความปลอดภัย ซึ่งหลักการนี้มีปัญหาในการใช้งานจริง อีกวิธีคือเปลี่ยนไปใช้ PHP แทน Javascript สำหรับประมวลผลแฟ้ม XML
การใช้งานในบทนี้ เน้นการใช้ Activex ผ่าน Javascript ซึ่ง Class นี้มีเพียง Internet Explorer ที่ใช้ได้ และมีเงื่อนไขที่เป็นข้อจำกัดหลายประการ ดังนั้นการจะนำไปใช้งานจริงจะต้องเข้าใจข้อจำกัด หรือไม่ก็เลือกวิธีอื่น ที่ไม่ใช่ Activex
ActiveXObject Object : This object is a Microsoft extension and is supported in Internet Explorer only, not in Windows 8.x Store apps.
มี 2 บรรทัดตัวอย่างที่น่าสนใจ คือ 1) มีการเรียกใช้ ActiveX ด้วย xml = new ActiveXObject("Microsoft.XMLDOM"); และ 2) การโหลดข้อมูลภายในเครื่อง ด้วย xml.load("education.xml"); ซึ่งการใช้ ActiveX จำเป็นต้องใช้ IE หรือ IE Tab Extension บน Chrome ส่วนการโหลดแฟ้ม education.xml ที่อยู่ภายในเครื่องไม่พบปัญหา แต่ถ้าอ้างอิงนอกเครื่องจะต้องลด Security เป็น Low ซึ่ง IE รุ่นใหม่ หรือ Browser รุ่นอื่น ไม่สามารถ Security ลงได้ เพราะต่ำสุดที่มีให้ลด คือ Medium
การเรียกใช้แฟ้ม xml ผ่าน url (web address) นอกเครื่องของตน มาประมวลผลบนแฟ้ม java script (.htm) บนเครื่อง server ภายนอก (เช่น thaiall.com) พบปัญหา การเรียกใช้คลาส activex กับ Microsoft.XMLDOM เนื่องจากปัญหาด้านความปลอดภัยของคลาส ActiveXObject() นี้ ทำให้ Browser รุ่นใหม่ไม่บริการ หรือไม่สนับสนุนอีกต่อไป มีเพียง IE (Internet Explorer) รุ่นเก่าที่ให้บริการปรับความปลอดภัยเป็นต่ำ ส่วน IE รุ่นใหม่ไม่สามารถกำหนด security เป็น low แม้จะใช้ IE tab ที่เป็น extension ใน chrome ก็ยังไม่สามารถเรียก แฟ้ม xml ผ่าน url เนื่องจากไม่มีตัวเลือกลด security เป็น low จากการทดสอบ หาก แฟ้ม java script วางไว้ใน local drive เช่น c:\ จะไม่พบปัญหา เมื่อใช้ Internet Explorer หรือ ie tab บน chrome อีกวิธีที่ใช้ได้ ปรากฎในภาพประกอบ คือ เปิด educationt.htm บน ie5 ที่อยู่ใน Windows98 ที่เปิดขึ้นมาผ่าน virtual box เหตุการณ์แบบนี้ ต่อไปเกิดขึ้นน้อยมาก เพราะ activex นั้น จะไม่ถูกสนับสนุนโดยเทคโนโลยีในปัจจุบัน และอนาคตอีกต่อไป เรื่องที่เล่ามานี้ เป็นตัวอย่างของเทคโนโลยีในอดีตที่จะถูกลืมเลือนไปในไม่ช้า
<?xml version="1.0"?> <employee> <empl department="sale"> <emplid>45001</emplid> <emplname>thanom</emplname> <emplsalary>15000</emplsalary> </empl> <empl department="sale"> <emplid>45002</emplid> <emplname>pikun</emplname> <emplsalary>9999</emplsalary> </empl> <empl department="admin"> <emplid>45003</emplid> <emplname>sombat</emplname> <emplsalary>12500</emplsalary> </empl> </employee>
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <xsl:for-each select="employee/empl"> <xsl:value-of/><br/> </xsl:for-each> </xsl:template> </xsl:stylesheet>
<html><head> <script language="javascript"> var xml,xsl,formatresult; xml = new ActiveXObject("Microsoft.XMLDOM"); xml.async = false; xml.load("employees.xml"); xsl = new ActiveXObject("Microsoft.XMLDOM"); xsl.async = false; xsl.load("list01.xsl"); formatresult = xml.transformNode(xsl); document.write(formatresult); </script></head> <body></body></html>
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <xsl:for-each select="employee/empl"> <xsl:value-of select="@department"/>, <xsl:value-of select="emplid"/>, <xsl:value-of select="emplname"/>, <xsl:value-of select="emplsalary"/><br/> </xsl:for-each> </xsl:template> </xsl:stylesheet>
<html><head> <script language="javascript"> var xml,xsl,formatresult; xml = new ActiveXObject("Microsoft.XMLDOM"); xml.async = false; xml.load("employees.xml"); xsl = new ActiveXObject("Microsoft.XMLDOM"); xsl.async = false; xsl.load("list02.xsl"); formatresult = xml.transformNode(xsl); document.write(formatresult); </script></head> <body></body></html>
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <xsl:for-each select="employee/empl"> <xsl:if test="@department[.='sale']"> <xsl:value-of select="@department"/>, <xsl:value-of select="emplid"/>, <xsl:value-of select="emplname"/>, <xsl:value-of select="emplsalary"/><br/> </xsl:if> </xsl:for-each> </xsl:template> </xsl:stylesheet>
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <xsl:for-each select="employee/empl"> <xsl:if test="@department[.='admin']"> <xsl:value-of select="@department"/> <xsl:value-of select="emplid"/>, <xsl:value-of select="emplname"/>, <xsl:value-of select="emplsalary"/><br/> </xsl:if> </xsl:for-each> </xsl:template> </xsl:stylesheet>
<html><head> <script language="javascript"> var xml,xsl; xml = new ActiveXObject("Microsoft.XMLDOM"); xml.async = false; xml.load("employees.xml"); function changexsl(xslstyle) { alert(xslstyle); xsl = new ActiveXObject("Microsoft.XMLDOM"); xsl.async = false; xsl.load(xslstyle); result.innerHTML = xml.transformNode(xsl); } function filter(position) { if (position == "sale") changexsl("list03sale.xsl"); if (position == "admin") changexsl("list03admin.xsl"); } </script></head> <body> <form method=post><select name="position"> <option value="sale">sale <option value="admin">admin </select> <input type=button name=change value=select onclick="filter(position.value)"> </form> <div id="result"></div> </body></html>
<?xml version="1.0" encoding="windows-874"?> <!DOCTYPE data [ <!ELEMENT data (member*)> <!ATTLIST data date CDATA #IMPLIED category CDATA #IMPLIED> <!ELEMENT member (url, website, sort, uniqueip, uniquesession, pageviews)> <!ELEMENT url (#PCDATA)> <!ELEMENT website (#PCDATA)> <!ELEMENT sort (#PCDATA)> <!ELEMENT uniqueip (#PCDATA)> <!ELEMENT uniquesession (#PCDATA)> <!ELEMENT pageviews (#PCDATA)> ]> <data date="2/09/2002" category="การศึกษา"> <member> <url>www.friends.co.th</url> <website>Friends.co.th - เพื่อนเก่า ทะเบียนรุ่น ทุกสถาบัน</website> <sort>10</sort> <uniqueip>14701</uniqueip> <uniquesession>50974</uniquesession> <pageviews>76436</pageviews> </member> <member> <url>www.ru.ac.th</url> <website>มหาวิทยาลัยรามคำแหง</website> <sort>68</sort> <uniqueip>3068</uniqueip> <uniquesession>4698</uniquesession> <pageviews>4976</pageviews> </member> <member> <url>www.stou.ac.th</url> <website>มหาวิทยาลัยสุโขทัยธรรมาธิราช</website> <sort>74</sort> <uniqueip>2905</uniqueip> <uniquesession>8621</uniquesession> <pageviews>13482</pageviews> </member> <member> <url>www.thaiall.com</url> <website>thaiall.com,สอบ,สอน,สืบค้น,บทความ,ภาพสวย,จัดอันดับ</website> <sort>114</sort> <uniqueip>1906</uniqueip> <uniquesession>5054</uniquesession> <pageviews>8201</pageviews> </member> <member> <url>www.NetDesign.ac.th</url> <website>NetDesign ศูนย์อบรมด้าน Web Design และ E-Commerce อันดับ1 ของเมืองไทย</website> <sort>138</sort> <uniqueip>1504</uniqueip> <uniquesession>4614</uniquesession> <pageviews>6769</pageviews> </member> <member> <url>www.eduzones.com</url> <website>ไอ เอ็ดดูเคชั่น โซน</website> <sort>155</sort> <uniqueip>1288</uniqueip> <uniquesession>3763</uniquesession> <pageviews>5687</pageviews> </member> <member> <url>www.ibscenter.net</url> <website>ไอบีเอส พอร์ทัลเว็บ = โลกใบใหม่ของวัยเรียน </website> <sort>214</sort> <uniqueip>851</uniqueip> <uniquesession>2168</uniquesession> <pageviews>3691</pageviews> </member> <member> <url>www.sk.ac.th</url> <website>โรงเรียนสวนกุหลาบวิทยาลัย </website> <sort>232</sort> <uniqueip>759</uniqueip> <uniquesession>3803</uniquesession> <pageviews>7035</pageviews> </member> <member> <url>www.triamudom.net</url> <website>โรงเรียนเตรียมอุดมศึกษา - เตรียมบอร์ด</website> <sort>236</sort> <uniqueip>747</uniqueip> <uniquesession>1571</uniquesession> <pageviews>2054</pageviews> </member> <member> <url>158.108.36.62/SCRIPTS/KUCityWWW/KUCityWWW.exe/www</url> <website>ชุมชน ม.เกษตร</website> <sort>252</sort> <uniqueip>686</uniqueip> <uniquesession>4864</uniquesession> <pageviews>7721</pageviews> </member> </data>
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <ol/> <xsl:for-each select="data/member"> <li/><xsl:value-of select="url"/> <xsl:value-of select="website"/> <xsl:value-of select="sort"/> <xsl:value-of select="uniqueip"/> <xsl:value-of select="uniquesession"/> <xsl:value-of select="pageviews"/> </xsl:for-each> </xsl:template> </xsl:stylesheet>
<html><head> <script language="javascript"> var xml,xsl,formatresult; xml = new ActiveXObject("Microsoft.XMLDOM"); xml.async = false; xml.load("education.xml"); xsl = new ActiveXObject("Microsoft.XMLDOM"); xsl.async = false; xsl.load("education.xsl"); formatresult = xml.transformNode(xsl); document.write(formatresult); </script></head> <body></body></html>
<html><head> <script language="javascript"> var xml,xsl,formatresult; xml = new ActiveXObject("Microsoft.XMLDOM"); xml.async = false; xml.load("http://truehits.net/xml/education.xml"); xsl = new ActiveXObject("Microsoft.XMLDOM"); xsl.async = false; xsl.load("http://www.thaiall.com/xml/education.xsl"); formatresult = xml.transformNode(xsl); document.write(formatresult); </script></head> <body></body></html>
<form action='structure.php'> <input name=file value="http://truehits.net/xml/education.xml" size=30> <input type=submit value="Show structure of XML"> </form>
<? if (strlen($file) < 4) { $file = "employees.xml"; } $depth = array(); function startElement($parser, $name, $attrs) { global $depth; for ($i = 0; $i < $depth[$parser]; $i++) { print " "; } print "$namen"; $depth[$parser]++; } function endElement($parser, $name) { global $depth; $depth[$parser]--; } $xml_parser = xml_parser_create(); xml_set_element_handler($xml_parser, "startElement", "endElement"); if (!($fp = fopen($file, "r"))) { die("could not open XML input"); } while ($data = fread($fp, 4096)) { if (!xml_parse($xml_parser, $data, feof($fp))) { die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser))); } } xml_parser_free($xml_parser); ?>
<form action='readxml.php'> <input name=file value="http://truehits.net/xml/education.xml" size=30> <input type=submit value="Read XML file"> </form>
<? if (strlen($file) < 4) { $file = "employees.xml"; } function trustedFile($file) { // only trust local files owned by ourselves if (!eregi("^([a-z]+)://", $file) && fileowner($file) == getmyuid()) { return true; } return false; } function startElement($parser, $name, $attribs) { print "<font color="#0000cc">$name</font>"; if (sizeof($attribs)) { while (list($k, $v) = each($attribs)) { print " <font color="#009900">$k</font>="<font color="#990000">$v</font>""; } } print ">"; } function endElement($parser, $name) { print "<font color=#0000cc>$name</font>"; } function characterData($parser, $data) { $data = str_replace("&",'&',$data); print "$data"; } function PIHandler($parser, $target, $data) { switch (strtolower($target)) { case "php": global $parser_file; // If the parsed document is "trusted", we say it is safe // to execute PHP code inside it. If not, display the code // instead. if (trustedFile($parser_file[$parser])) { eval($data); } else { printf("Untrusted PHP code: <i>%s</i>", htmlspecialchars($data)); } break; } } function defaultHandler($parser, $data) { if (substr($data, 0, 1) == "&" && substr($data, -1, 1) == ";") { printf('<font color="#aa00aa">%s</font>', htmlspecialchars($data)); } else { printf('<font size="-1">%s</font>', htmlspecialchars($data)); } } function externalEntityRefHandler($parser, $openEntityNames, $base, $systemId, $publicId) { if ($systemId) { if (!list($parser, $fp) = new_xml_parser($systemId)) { printf("Could not open entity %s at %sn", $openEntityNames, $systemId); return false; } while ($data = fread($fp, 4096)) { if (!xml_parse($parser, $data, feof($fp))) { printf("XML error: %s at line %d while parsing entity %sn", xml_error_string(xml_get_error_code($parser)), xml_get_current_line_number($parser), $openEntityNames); xml_parser_free($parser); return false; } } xml_parser_free($parser); return true; } return false; } function new_xml_parser($file) { global $parser_file; $xml_parser = xml_parser_create(); xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 1); xml_set_element_handler($xml_parser, "startElement", "endElement"); xml_set_character_data_handler($xml_parser, "characterData"); xml_set_processing_instruction_handler($xml_parser, "PIHandler"); xml_set_default_handler($xml_parser, "defaultHandler"); xml_set_external_entity_ref_handler($xml_parser, "externalEntityRefHandler"); if (!($fp = @fopen($file, "r"))) { return false; } if (!is_array($parser_file)) { settype($parser_file, "array"); } $parser_file[$xml_parser] = $file; return array($xml_parser, $fp); } if (!(list($xml_parser, $fp) = new_xml_parser($file))) { die("could not open XML input"); } print "<pre>"; while ($data = fread($fp, 4096)) { if (!xml_parse($xml_parser, $data, feof($fp))) { 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 "</pre>"; xml_parser_free($xml_parser); ?>
<?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); } ?>
<?xml version="1.0"?> <information> <fld1>burin rujjanapan</fld1> <fld2>Tel. 0-1992-7223</fld2> <fld3>M</fld3> </information> <body> แสดงการอ่านข้อมูลจาก xmljava<br> <script language="JavaScript"> var xmlDoc; xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async = false; xmlDoc.load("dataj.xml"); var objNode; objNode = xmlDoc.documentElement.childNodes; for (i=0;i<objNode.length;i++) document.write(objNode.item(i).firstChild.nodeValue+"<br>"); </script> </body>
<body> <script language="JavaScript"> var xmlDoc; xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async = false; xmlDoc.load("http://truehits.net/xml/education.xml"); var objNode; objNode = xmlDoc.documentElement.childNodes; for (i=0;i<objNode.length;i++) { document.write("<b>"+ objNode.item(i).firstChild.nodeName + "</b> = " + objNode.item(i).firstChild.text+" | "+ "<b>"+ objNode.item(i).firstChild.nextSibling.nodeName + "</b> = "+ objNode.item(i).firstChild.nextSibling.text+" | "+ "<b>"+ objNode.item(i).firstChild.nextSibling.nextSibling.nodeName+"</b>="+ objNode.item(i).firstChild.nextSibling.nextSibling.text+" | "+ "<b>"+ objNode.item(i).lastChild.nodeName + "</b> = " + objNode.item(i).lastChild.text + " | " + "<br>"; } </script> </body>
<? if (!isset($_POST['file0'])) { print "<body><pre><form action=crtxml.php method=post> File0 :: <input name=file0 value=filex> Rec0 :: <input name=rec0 value=recx> Fld1 :: <input name=fld1 value=id> Fld2 :: <input name=fld2 value=name> Fld3 :: <input name=fld3 value=salary> Fld4 :: <input name=fld4> Fld5 :: <input name=fld5> Fld6 :: <input name=fld6> Fld7 :: <input name=fld7> Fld8 :: <input name=fld8> Fld9 :: <input name=fld9> <textarea name=data rows=10 cols=80> 101,สมปอง,5000 102,บุรินทร์,25000 103,ศิรา,12000 </textarea> <input type=submit value=create_XML></form>"; } else { print '<?xml version="1.0" encoding="windows-874"?>'; print "\n<" . $_POST['file0'] . ">\n"; $getline = preg_split("/[sn]+/",$_POST['data']); for ($j=0;$j<count($getline)-1;$j++) { if (strlen($getline[$j]) > 0) { print "<". $_POST['rec0'] . ">\n"; $rec = preg_split("/[s,]+/",$getline[$j]); for ($k=0;$k<count($rec)-1;$k++) { print "<". $_POST['fld'. ($k + 1)]. ">$rec[$k]</". $_POST['fld'. ($k + 1)]. ">\n"; } print "</" . $_POST['rec0'] . ">\n"; } } print "</". $_POST['file0'] . ">"; } ?>
ใน Android Studio เคยทดสอบการใช้ String-array ในบทความตอนที่ 7 เกี่ยวกับการพัฒนาแอพบนแอนดรอย มีตัวอย่างข้อมูลในแฟ้ม strings.xml เป็นดังนี้ บทความที่ 611 … บทความที่ 610 … บทความที่ 609 … หากเรียกใช้ใน activity เป็นดังนี้ Resources res = getResources(); String[] mData = res.getStringArray(R.array.data); textView1.setText(mData[0]); textView2.setText(mData[1]); textView3.setText(mData[2]); http://www.thaiall.com/blog/burin/8660/ แฟ้มแบบ xml สามารถเขียนโปรแกรมภาษา PHP จัดการได้ มีตัวอย่างที่ http://www.thaiall.com/xml หากต้องการแฟ้มในรูปแบบ xml สามารถใช้โปรแกรม excel https://msdn.microsoft.com/en-us/library/office/gg469857(v=office.14).aspx http://www.excel-easy.com/examples/xml.html ขั้นตอนมีดังนี้ 1. บน Excel 2016 ใน Office 365 Right click บน Ribbon Menu แล้วมองหา Customize the Ribbon... ในหน้าต่างทางขวาสุดจะพบชื่อ Tab ถูก Check ไว้หมด ยกเว้น Developer ก็คลิ๊กซะ จากนั้นจะพบ Tab นี้อยู่ต่อท้าย Tab:View 2. ใช้ notepad สร้าง schema.xml หรือโครงสร้างข้อมูลแบบ XML <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <data-set xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <item>sample data in first record</item> <item>sample data in second record</item> </data-set> ต้องสร้างตัวอย่าง item 2 record ตอนทดสอบสร้าง 1 record แล้วจะรู้จักเพียง record เดียว http://www.excel-easy.com/examples/xml.html (XMLSchema-instance) 3. ใน Excel ยังไม่มีข้อมูล คลิ๊กที่ Tab:Developer แล้ว Import, schema.xml ข้างต้น เลือกวางที่ Sheet1!$A$1 จะพบข้อมูล มี item เป็น header ตามด้วข้อมูลในแถวที่ 2 และ 3 ต่อจากนี้ Click Source ใน Tab:Developer จะพบโครงสร้างของ schema 4. กรอกข้อมูลทับ เริ่มต้นแถวที่ 2 แถวที่ 2 ว่า cat แถวที่ 3 ว่า rat แล้วเพิ่มแถวที่ 4 ว่า dog แถวที่ 5 ว่า hen 5. save as เป็นแฟ้มแบบ XML data จะได้แฟ้ม data.xml <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <data-set xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <item>cat</item> <item>rat</item> <item>dog</item> <item>hen</item> </data-set> 6. ตัวอย่างจาก https://support.office.com/en-us/article/Map-XML-elements-to-cells-in-an-XML-Map-ddb23edf-f5c5-4fbf-b736-b3bf977a0c53 แฟ้ม expenses.xml ไม่มี schema ภายนอก แต่เปิดด้วย excel แล้ว excel สามารถอ่านโครงสร้าง แล้วสร้าง schema ให้อัตโนมัติ แต่ไม่มี schema ทำให้ save as กลับไปเป็น .xml ไม่ได้ เมื่อ verify map for export พบว่า Denormalized data แม้ใช้การ import แล้วลาก header ไปวาง ก็ยังไม่ผ่าน <?xml version="1.0" encoding="UTF-8" standalone="no" ?> <Root> <EmployeeInfo> <Name>Jane Winston</Name> <Date>2001-01-01</Date> <Code>0001</Code> </EmployeeInfo> <ExpenseItem> <Date>2001-01-01</Date> <Description>Airfare</Description> <Amount>500.34</Amount> </ExpenseItem> <ExpenseItem> <Date>2001-01-01</Date> <Description>Hotel</Description> <Amount>200</Amount> </ExpenseItem> </Root> 7. ตัวอย่างจาก https://support.office.com/en-us/article/Map-XML-elements-to-cells-in-an-XML-Map-ddb23edf-f5c5-4fbf-b736-b3bf977a0c53 แฟ้ม expenses.xsd มีโครงสร้าง <?xml version="1.0" encoding="UTF-8" standalone="no" ?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="Root"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="0" maxOccurs="1" name="EmployeeInfo"> <xsd:complexType> <xsd:all> <xsd:element minOccurs="0" maxOccurs="1" name="Name" /> <xsd:element minOccurs="0" maxOccurs="1" name="Date" /> <xsd:element minOccurs="0" maxOccurs="1" name="Code" /> </xsd:all> </xsd:complexType> </xsd:element> <xsd:element minOccurs="0" maxOccurs="unbounded" name="ExpenseItem"> <xsd:complexType> <xsd:sequence> <xsd:element name="Date" type="xsd:date"/> <xsd:element name="Description" type="xsd:string"/> <xsd:element name="Amount" type="xsd:decimal" /> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> ถ้า import schema ก่อน แล้วนำ header ไปวาง ถึงจุดนี้ verify map for export พบว่า Root_map is exportable แล้วพิมพ์ข้อมูลตาม column ก็ไม่มีปัญหา หรือคัดลอกข้อมูลมาวางตาม header อย่างถูกต้องก็ทำได้ จะทำให้ save as เป็นแฟ้มแบบ xml ได้ การกรอกข้อมูลต้องกรอกแบบ Normalize ไม่ใช่กรอกแบบ Excel 8. ตัวอย่างจาก ข้อมูลหน่วยงานบริการสุขภาพจังหวัดแพร่ https://data.go.th/DatasetDetail.aspx?id=9fafcf88-13dd-4b87-a235-1ab553f148ca นำเข้า excel โดยไม่ต้องมี schema เมื่อ save as เป็นแบบ xml ออกไป ก็ไม่พบปัญหา มีการทำงานแบบ XMLSchema-instance คือ อ่านจากโครงสร้างมาทำ Schema ได้เลย <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <healthoffice xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <record> <code>635300</code> <name>โรงพยาบาลส่งเสริมสุขภาพตำบลบ้านศรีภูมิ ตำบลแม่คำมี</name> <deptcode> <code>21002</code> <name>กระทรวงสาธารณสุข สำนักงานปลัดกระทรวงสาธารณสุข</name> </deptcode> <typecode> <code>18</code> <name>โรงพยาบาลส่งเสริมสุขภาพตำบล</name> </typecode> <level_hospital_id/> <bed>0</bed> <hos_size>ไม่ข้อมูล</hos_size> <areacode> <code>54011404</code> <provincecode>54</provincecode> <province>แพร่</province> <amphurcode>1</amphurcode> <amphur>เมืองแพร่</amphur> <tamboncode>14</tamboncode> <tambon>แม่คำมี</tambon> <moo>4</moo> </areacode> <status> <code>1</code> <name>เปิดดำเนินการ</name> </status> <servicelevel> <code>10</code> <name>1 ปฐมภูมิ</name> </servicelevel> <servicetype/> <update/> <code5>6353</code5> </record> </healthoffice> 9. แฟ้มนี้นำเข้า excel กรอกข้อมูล record ต่อไป แล้ว save as เป็น XMl ได้เลย <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <rootdata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <record> <field1>60-001</field1> <field2>Tom</field2> </record> <record> <field1>60-002</field1> <field2>Boy</field2> </record> </rootdata> 10. แฟ้มนี้นำเข้า excel กรอกข้อมูล record ต่อไป แล้ว save as เป็น XMl ได้เลย <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <rootdata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <record>Tom</record> <record>Boy</record> </rootdata> 11. ??? <?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" version="1.0"> <!-- xmlns:xsl="http://www.w3.org/1999/XSL/Transform" firefox56:ok, ie11:fail --> <!-- xmlns:xsl="http://www.w3.org/TR/WD-xsl" firefox56:fail, ie11:ok --> <xsl:template match="/"> <xsl:for-each select="employee/empl"> <xsl:value-of/> <!-- firefox56:fail, ie11:ok <xsl:value-of/> --> <!-- firefox56:ok, ie11:fail <xsl:value-of select="emplid" /> <xsl:value-of select="emplname" /> <xsl:value-of select="emplsalary" /><br/> --> </xsl:for-each> </xsl:template> </xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <data-set xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <item>รายการแรก</item> <item>รายการที่สอง</item> </data-set> หรือ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <data-set xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <item> <item1>101</item1> <item2>วิเชพ</item2> </item> <item> <item1>102</item1> <item2>ศศิวิมล</item2> </item> <item> <item1>103</item1> <item2>บุรินทร์</item2> </item> <item> <item1>104</item1> <item2>เกศริน</item2> </item> </data-set>
พบว่า truehits.net เผยแพร่ข้อมูลเว็บไซต์ด้านการศึกษาใน รูปแบบ XML สำหรับ ประเทศไทย มีเว็บไซต์ด้านการศึกษาจำนวนมาก พบว่า เว็บไซต์ truehits.net เผยแพร่ข้อมูลสถิติการเข้าถึงเว็บไซต์ของสมาชิก มีรายการชื่อเว็บไซต์ที่สามารถนำมาใช้ได้ จากลิงค์ http://truehits.net/xml/ สำหรับกลุ่มการศึกษามีลิงค์ที่ http://truehits.net/xml/education.xml ได้ข้อมูล 10 รายการ ส่วน http://truehits.net/xml/education_all.xml จะมีข้อมูลของสมาชิกในกลุ่มทั้งหมด เมื่อดาวน์โหลดแฟ้มนี้ เมื่อวันที่ 1 เมษายน 2565 พบว่า เป็นรายงานสรุปข้อมูลประจำวันที่ 31 มีนาคม 2565 มีข้อมูลทั้งหมด 578 รายการ สำหรับข้อมูลกลุ่มอื่น สามารถใช้ลิงค์เดิม แต่เปลี่ยนคำว่า education เป็น allmember, government, computer, education, travel, health, entertain, art, social, news, science, organize, person, internet, business, sport ก็จะพบข้อมูลตามชื่อกลุ่มที่เป็นข้อมูลล่าสุด ที่สามารถนำข้อมูลในรูปแบบ XML มาใช้ได้ตามต้องการ
ซึ่งแฟ้ม education.xml จะมีรูปแบบตัวอักษรเป็น ANSI เมื่อแปลงเป็น json ที่ใช้ โค้ดภาษา php โดยใช้ json_encode จะได้แฟ้มข้อมูลรูปแบบตัวอักษรเป็น utf-8 แล้วใช้ class easyui-datagrid ของ jquery-easyui แสดงข้อมูลจาก json เป็นตาราง