thaiall logomy background
เอ็กเอ็มแอล (XML)
my town
ความหมายของ XML

XML คือ ภาษาสำหรับอธิบายข้อมูล และเก็บข้อมูลไปพร้อมกัน มีโครงสร้างคล้ายกับ HTML ซึ่งผู้สร้างข้อมูลกำหนด TAG เองได้ เช่น <WIFE> หรือ <Customer>

HTML คือ ภาษาสำหรับแสดงผลข้อมูล และแสดงข้อมูลอย่างไร ซึ่งมี TAG เป็นคำสั่งตายตัว เช่น <HTML> หรือ <IMG> เป็นต้น

XML (eXtensible Markup Language) คือ รูปแบบข้อมูลที่มีโครงสร้างที่เอื้อต่อการแลกเปลี่ยนข้อมูลในเครือข่ายอินเทอร์เน็ต ใช้รูปแบบที่ขยายจากภาษาเฮชทีเอ็มแอลสำหรับกำหนดวัตถุ เป็นมาตรฐานที่สอดคล้องตาม RFC 7303

ถูกพัฒนาขึ้นโดย W3C (World Wide Web Consortium)

การตั้งชื่อ 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

แฟ้ม xml และ xsl
  1. แฟ้ม XML (eXtensible Markup Language) คือ แฟ้มข้อมูลที่เก็บในเครื่องบริการ ที่เปิดให้นักพัฒนาเข้าไปคัดลอก หรืออ่านข้อมูลมาใช้ แบบ Readonly ด้วยภาษาใด ๆ ไปใช้ประมวลผลได้ แล้วอาจแสดงผลบน webpage ของผู้พัฒนา พบตัวอย่างการเผยแพร่ข้อมูลของภาครัฐในรูปแบบ XML ผ่าน data.go.th ที่สามารถนำไปใช้ได้ ซึ่งแฟ้มแบบ XML นี้ คล้ายกับแฟ้มแบบ .dbf, .mdb, .xlsx, .csv, .json หรือ .txt ซึ่งแฟ้ม .xml เป็นที่ยอมรับ และใช้กันแพร่หลาย โดยผู้ใช้สามารถเขียนโปรแกรมขึ้นมา เพื่อใช้อ่านข้อมูลไปใช้ได้
  2. แฟ้ม XSL (eXtensible Stylesheet Language) คือ แฟ้มที่ใช้อธิบายว่าจะแสดง XML อย่างไร จะคล้ายกับ CSS
  3. แฟ้ม XSL หรือ XSLT (EXtensible Stylesheet Langauge Transformation) คือ การแปลง (Tranformation) เอกสารข้อมูลที่มีรูปแบบ XML ให้เป็นตามรูปแบบของ XSL แล้วนำเสนอข้อมูลตามรูปแบบที่กำหนด มักแปลงออกไปเป็นรูปแบบ HTML หรือ Plain Text ที่เข้าใจ และนำเสนอใน Webpage ได้ง่าย [#]
  4. แฟ้ม HTML (Hyper Text Markup Language) คือ แฟ้มที่นำ xml และ xsl พาพบกันและแสดงผล
  5. แฟ้ม PHP (PHP Hypertext Preprocessor) คือ ภาษา Server-Sided Script เพื่อประมวลผลแฟ้ม XML ตามที่ต้องการ
แนะนำเว็บไซต์
xmlsoft.org/guidelines.html
php.net/manual/en/ref.xml.php
xml.com
vcharkarn.com/include/article/
maani.us/xml_charts/ .zip
thaiall.com/vbnet/data_conn.htm ***
ตัวอย่างแฟ้ม XML ที่ Online
thaiall.com/xml/family.xml
truehits.net/xml/education.xml
aripfan.com/.. ../feed/
บทที่ 1 - แฟ้ม employees.xml ของเรา Data file : employees.xml
แฟ้มข้อมูลแบบ xml ที่สามารถถูกเรียกใช้งานแบบ Readonly จากระยะไกล มีตัวอย่างแฟ้มอื่นที่เรียกแฟ้มนี้ไปใช้
1. list01.xsl สำหรับกำหนดการเลือก และรูปแบบการแสดงผล
2. list01.htm สำหรับเรียกใช้ list01.xsl ด้วย javascript (แบบเต็ม)
3. list02.xsl สำหรับเลือก 4 เขตข้อมูล
4. list02.htm ใช้เฉพาะคำสั่งที่จำเป็นสำหรับเรียก list02.xsl และ employees.xml
5. list03sale.xsl สำหรับเลือกเฉพาะ department = sale
6. list03admin.xsl สำหรับเลือกเฉพาะ department = admin
7. list03.htm สำหรับสั่งเลือกข้อมูลที่ต้องการ
ทดสอบบน Stand alone ที่ใช้ IE5 - IE11
ประโยชน์ของ XML คือ ใช้แลกเปลี่ยนข้อมูลระหว่างเครื่อง เป็นที่นิยม ทำงานร่วมกับแฟ้ม xsl ที่ใช้จัดรูปแบบข้อมูลใหม่ มีตัวอย่างคล้ายแฟ้ม education.xsl คู่กับ education.xml คู่กับ education.htm
บทที่ 2 - แฟ้ม employees.xml ของ truehits.net
Data file : education.xml(updated) / 3 ก.ย.2545
1. education.xsl สำหรับกำหนดการเลือก และรูปแบบการแสดงผล
2. education.htm สำหรับเรียกใช้ education.xsl ด้วย javascript
3. educationt.htm ใช้ข้อมูลจาก truehits.net/xml/education.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 การใช้ IE5 - IE11 และโหลดภายในเครื่อง ตัวอย่างคำสั่งสำคัญ ใน education.htm

มี 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

2.2 การใช้ ie5 ลด Security เป็น Low บน win98 ใน Virtualbox

Test
- Localhost: ie5 - ie11 is ok
- Localhost: ietab in chrome is ok
- Localhost: chrome is no
- www: ie security:medium is no
- www: ie5 security:low is ok
ตัวอย่างการมีเงื่อนไขในการประมวลผล
ตัวอย่าง - xml.load("http://www.truehits.net/xml/education.xml");

การเรียกใช้แฟ้ม 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 นั้น จะไม่ถูกสนับสนุนโดยเทคโนโลยีในปัจจุบัน และอนาคตอีกต่อไป เรื่องที่เล่ามานี้ เป็นตัวอย่างของเทคโนโลยีในอดีตที่จะถูกลืมเลือนไปในไม่ช้า

บทที่ 3 - การใช้ xml ผ่าน php Data file : education.xml #
1. structure.php คือ โปรแกรมอ่านโครงสร้างในแฟ้ม XML education.xml / employees.xml / checklist.xml / family.xml
2. readxml.php คือ โปรแกรมอ่านแฟ้ม XML แล้วแสดงแต่ละส่วนแยกสีอย่างชัดเจน
3. xmldata.php คือ โปรแกรมอ่านแฟ้ม employees.xml มาแสดงผลอย่างง่าย โดยไม่ต้องรู้โครงสร้างแฟ้ม XML ก่อน
เครื่องบริการของ thaiall.com ไม่อนุญาตให้ใช้ fopen อ่านแฟ้มผ่าน url จากภายนอกเครื่อง แต่เรียก structure.php บน xampp จะเรียกแฟ้ม education.xml จาก truehits.net มาทำงานได้ปกติ
บทที่ 4 - การใช้ xml ผ่าน php Data file : dataj.xml
- xmljavas.htm คือ โปรแกรมอ่านข้อมูลจากแฟ้ม XML เพียงระเบียนเดียว
มีคำสั่งใช้ Javascript เรียกใช้ Class และ Object
xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
ทำงานได้บน Internet Explorer แต่ไม่สามารถใช้งานบน Browser รุ่นใหม่
บทที่ 5 - การใช้ xml ผ่าน javascript ใน html ระเบียนเดียว Data file : dataj.xml
- xmljavas.htm คือ โปรแกรมอ่านข้อมูลจากแฟ้ม XML เพียงระเบียนเดียว
มีคำสั่งใช้ Javascript เรียกใช้ Class และ Object
xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
ทำงานได้บน Internet Explorer แต่ไม่สามารถใช้งานบน Browser รุ่นใหม่
บทที่ 6 - การใช้ xml ผ่าน javascript ใน html หลายระเบียน Data file : education.xml
- xmledu.htm คือ โปรแกรมอ่านข้อมูลจากแฟ้ม XML หลายระเบียน มาแสดงผล
การเรียกใช้ใน Internet Explorer พบว่า Browser จะถามการอนุญาตเนื้อหาที่ถูกปิดกั้น (Allow blocked Content)
บทที่ 7 - การแปลง csv เป็น xml crtxml.php คือ โปรแกรมแปลงแฟ้มแบบ CSV (Comma Separated Variable) เป็น XML
โปรแกรมนี้ช่วยสร้างแฟ้ม XML โดยกำหนดชื่อเขตข้อมูล (Field name) และข้อมูล (Data) หลังกดปุ่ม submit ก็จะได้แฟ้ม XML ท่านเพียงแต่ save as โดยเลือก type เป็น HTML only แล้ว ตั้งชื่อใหม่มีนามสกุลเป็น .XML ก็จะนำแฟ้มนี้ไปใช้เป็น XML file ได้ หรือ Right click ด้วย mouse บนแฟ้มที่มีรูปแบบเป็น XML จากนั้นเลือก View source แล้ว Save as เป็นแฟ้มที่มีสกุลเป็น XML เพื่อนำไปใช้ต่อไป
บทที่ 8 - แปลงข้อมูลที่มีอยู่เป็น XML
โปรแกรมต่าง ๆ ยอมรับแฟ้ม XML มากขึ้น ทำให้การ convert ข้อมูลที่มีอยู่เป็น XML ทำได้ง่ายขึ้น
ตัวอย่าง 1 : ใช้ MS Access 2000 convert จากตาราง ได้ แฟ้ม xml xsd xsl มาพร้อมกันเลย
ตัวอย่าง 2 : ใช้ MS Excel 2002 จัดเก็บเป็นแฟ้มแบบ xml (Excel รุ่นนี้เปิด XML มาแก้ไขได้เลย)
ตัวอย่าง 3 : ใช้ PHPMyAdmin ส่งข้อมูลใน MySQL ไปเป็นแฟ้ม xml (Mysql-front ก็ทำได้เช่นกัน)
ตัวอย่างโค้ด 1. Data file : employees.xml
<?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>

2. Source of : list01.xsl
<?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>

3. Source of : list01.htm
<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>

4. Source of : list02.xsl
<?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>

5. Source of : list02.htm
<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>

6. Source of : list03sale.xsl
<?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>

7. Source of : list03admin.xsl
<?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>

8. Source of : list03.htm
<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>

9. Data file : http://truehits.net/xml/education.xml
<?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>

10. Source of : education.xsl
<?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>

11. Source of : education.htm
<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>

12. Source of : educationt.htm
<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>

13. Source of : structure.php
<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);
?>

14. Source of : readxml.php
<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);
?>
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);	
}
?>
16. Source of : xmljavas.htm ตัวอย่างแฟ้ม dataj.xml
<?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>

17. Source of : xmledu.htm
<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>

18. Source of : crtxml.php
<?
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
ใน 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>
conversion data in cheqa
การจัดการข้อมูล xml ใน Excel 2016 ขั้นตอนการสร้างแฟ้ม Schema (โครงสร้างการรับรู้) และจัดการข้อมูลใน Excel 2016 1. วางแผน และสร้างแฟ้ม Schema ด้วย notepad เตรียม นิยามข้อมูล (Schema) ว่าจะให้ข้อมูลมีรูปแบบอย่างไร แล้วก็สร้าง text file ที่เป็น schema แล้วจัดเก็บเป็นแฟ้ม schema.xml แล้วกำหนด encoding = UTF-8 มีตัวอย่างรายละเอียดในแฟ้มดังนี้
<?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>

อ่านเพิ่มเติม https://www.w3schools.com/xml/schema_intro.asp
อ่านเพิ่มเติม https://www.xmlvalidation.com/
2. เปิดโปรแกรม Excel 2016
จะได้ workbook มาเพื่อทำงาน และมี sheet1
เปิดแฟ้ม schema.xml
พบ Please select how you would like to open this file
- As an XML table
- As a read-only workbook
- Use the XML Source task pane
ให้เลือก As an XML table
3. พบ item1 และ item2
ทำให้นึกถึง รหัสพนักงาน (eid) และ ชื่อพนักงาน (ename)
eid,ename
101,burin
102,nation
103,yonok
แก้ชื่อเขตข้อมูลใน sheet จะไม่มีผล เพราะเป็น structure
4. Menu bar, Developer, Source
จะพบ XML Maps in this workbook
ชื่อ data-set_Map และพบ Structure ตามที่กำหนดไว้
คือ data-set = item {item1, item2}
5. หากแก้ไขข้อมูล หรือเพิ่มใหม่แล้ว ก็จัดเก็บเป็น xml ได้เลย
เลือก Save as Type = XML Data (*.xml)
การแปลงข้อมูลในระบบ cheqa


ข้อมูลมีไว้ทำอะไรได้หลายอย่าง
แล้วก็มีกรณีศึกษาเรื่องการใช้ ข้อมูล (Data) และ การเปลี่ยนแปลงข้อมูล (Conversion) ผมเตรียมเรื่องราวไปเล่าให้นักศึกษาฟังเรื่อง data converter จากข้อมูลรูปแบบหนึ่งเป็นอีกรูปแบบหนึ่ง ตัวอย่างนี้ใช้จริง เป็นข้อมูลที่ สกอ. จัดให้ทุกมหาวิทยาลัยส่ง แล้วก็มาเปิดเผยผลการประเมินมหาวิทยาลัย ที่แต่ละมหาวิทยาลัยมีการประเมินตนเอง เป็นการเผยแพร่แบบสาธารณะ ที่ไม่ต้องลงชื่อเข้าใช้ (no sign-in + readonly)
1. เข้าไปก็พบปุ่ม "เข้าสู่ระบบเพื่อดูอย่างเดียว"
2. เลือกปี และสถาบัน
3. เลือกดู คลิ๊กอ่านได้เลย คือ "รายงาน ส" หรือ "รายงาน ป"
4. หรือเข้า รายงานข้อมูลพื้นฐาน CDS + พิมพ์รายงานการประเมินตนเองของสถาบัน
5. download แฟ้มแบบ xml เป็นข้อมูลที่ยังอ่านไม่ได้ ได้ทั้ง ประเมินตนเอง SAR และ ผลการประเมินจากคณะกรรมการ CAR
6. ทำการ download ไฟล์ Setup CHEOnline Reporting Generator[Rtf] Last Updated : 28 มิ.ย. 2556 22.00น.
7. แปลงแฟ้ม xml ที่ได้เป็น word โดยเปิดโปรแกรม แล้วเลือกแฟ้ม แล้วกด Generated Fullpaper
+ http://202.44.139.26/cheqa3d2559/
โปรแกรม MDB Viewer Plus
MDB Viewer Plus คือ โปรแกรมช่วยในการเปิดแฟ้ม .mdb ที่สร้างมาจาก Microsoft Access 97 สามารถ download รุ่น Portable มาใช้ได้ ใช้โปรแกรมนี้เปิด NorthWind.mdb โดยคลิ๊ก Menu bar, File, Open แล้วเลือกแฟ้มก็จะเปิดตารางทั้งหมดมาให้เห็น สามารถเลือก Menu bar, Table, Export table เป็นแฟ้มแบบ .csv หรือ .xml เป็นต้น หรือ Menu bar, Table, Generate SQL - Create และทดสอบ Execute คำสั่ง SQL ได้
MDB Viewer Plus is a freeware viewer plus editor for opening Microsoft Access MDB and ACCDB database files. It does not need to be installed to run. It uses Microsoft Data Access Components (MDAC) which is installed as part of Windows.
ดาวน์โหลด : MDBPlus.zip
อ่าน xml แปลงเป็น json ส่งไปแสดงในตาราง easyui-datagrid Education on 31 March 2022

บว่า 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 เป็นตาราง

truehits_education_650331_all.xml
truehits_education_650331_json.php
truehits_education_650331_member_to_rows.php
truehits_education_650331.php
truehits_education_650331_5_rows.xml
truehits_education_650331.xml
ประยุกต์ใช้กับระบบ Checklist + thaiall.com/checklist.php
+ thaiall.com/xml/checklist.xml
rspsocial
Thaiall.com