ตัวอย่างการParse XMl ด้วย PHP

ตัวอย่างการParse XMl ด้วย PHP

หลังจากตอนที่หนึ่งที่เราได้ทำการแปลงเอกสาร XML ด้วย PHP ไปแล้ว สามารถนำไปแสดงผลได้ ต่อจากนี้ถ้าเราต้องการนำไปใช้ประโยชน์อย่างอื่นหละจะทำยังไงดี ในตัวอย่างนี้ผมจะเอาตัวอย่างการบันทึกเป็นไฟล์ XML ไฟล์ใหม่มาเป็นตัวอย่าง เรื่องของเรื่องก็คือเราจะแปลงจากฟอร์แมต XML ซึ่งบางทีมันส่งมาไม่ตรงกับการใช้งานของเรา เราก็อาจจะนำมาแปลงดึงเอาเฉพาะข้อมู,ที่เราต้องการพร้อมกับแปลงใหม่ เพื่อให้มันใช้งานได้นั่นเอง และนี่แหละเขาถึงได้พูดถึง XML ว่ามันเป็นภาษาที่สามารถออกแบบแท็กได้เอง ขอให้ระหว่างผู้รับและผู้ส่งข้อมูลเข้าใจโครงสร้างของกันและกันได้ก็พอ XML จึงเป็นภาษาที่มันสามารถติดต่อระหว่างโปรแกรมที่อยู่คนละแฟลตฟอร์มได้นั่นเอง
พูดซะยืดยาวเรามาดูตัวอย่างการแปลงเอ็กเอ็มแอลกันเลยครับ
ขั้นตอนการทำงานจะเป็นดังนี้นะครับ คือเริ่มจากการอ่านเอ็กเอ็มแอลเข้ามา –> ดึงเอาเฉพาะส่วนที่เราต้องการ –> บันทึกไฟล์เอ็กเอ็มแอล
โดยทั้งหมดนี้จะอาศัย Domdocument ซึ่งเป็นไลบรารีหนึ่งที่มีให้ใช้ใน PHP อยู่แล้วซึ่งหาได้ในเว็บของ PHP แต่อาจจะมาศึกษาได้จากตัวอย่างโค้ดนี้ก็ได้เช่นกัน จะไม่ขอพูดถึงรายละเอียดของ Domdocument นะครับ เอาง่ายๆก็คือมันสามารถใช้อ่านโครงสร้างของ XML ได้นั่นแหละ
จากตัวอย่างการสร้าง Domdocument โดยใช้ PHP เราสารถมารถประกาศและเรียกใช้ดังนี้ครับ

สร้างตัวแปร $dom เป็นชนิด domducument มาเพื่อใช้งาน
<?php
$dom = new domDocument;
/*
Load เอ็กเอ็มแอลเข้ามาเก็บไว้ในตัวแปร $dom ในที่นี้สามารถใส่เป็น URL ได้เช่นกัน
และ file ที่โหลดเข้ามาต้องเป็นเอ็กเอ็มแอลเท่านั้นจึงจะสามารถโหลดได้นะครับ ไม่เช่นนั้นแล้วจะเกิด Error ขึ้นทันที
เพราะ domDocument เราไม่รองรับนั่นเอง
*/
$dom->load('filename.xml');
/*
เมื่อโหลดเข้ามาเก็บไว้ในตัวแปรแล้วต่อไปจะสร้างตัวแปรชื่อ $s เพื่อ import xml แบบง่ายๆ ในที่นี้ใช้ simplexml_import_dom
*/
$s = simplexml_import_dom($dom);
/*
และก็ต่อมาจะสร้างตัวแปรที่เป็น domDocument อีกตัวหนึ่งเพื่อเอาไว้เก็บข้อมูล XMl หลังจากที่เราแปลงแล้วนั้นเอง ตั้งตัวแปร ชื่อ $saveXML ละกัน
*/
$saveXML = new domDocument;
/*ให้ย้อนกลับไปดูตอนที่แล้วนิดนึงนะครับ เพราะว่าผมจะใช้ Rss เป็นฟอร์แมตมาตรฐานในการใช้เป็นตัวอย่าง และในตัวอย่างนี้ สมมติว่าเราต้องการแปลง XML ให้อยู่ในรูป
<?xml version="1.0"?>
<?items?>
<?item?>item1?<?/item?>
<?item?>item2?<?/item?>
<?item?>item3?<?/item?>
<?/items?>
<?/xml?>
ดังนั้นจึงจำเป็นต้องสร้างโหนด items ขึ้นมาให้กับ $saveXML ก่อน
*/
$items = $saveXML->appendChild($saveXML->createElement('items'));
/*
และทีนี้เราก็จะมาวนลูปเพื่อดึงเอาค่าจากไฟล์ XML ที่เราดึงมา แล้วเอาไปเก็บในไฟล์ใหม่
*/
$i=0;
while($s->channel[0]->item[$i]->title) {
//สร้าElementใหม่ขึ้นมา ในที่นี้คือการสร้าง Element "title" ไว้ข้างใน item
$item = $items->appendChild($saveXML->createElement('item'));
$title = $item->appendChild($saveXML->createElement('title'));
//ดึงข้อมูลแล้วเพิ่มเข้าไปในตัวแปรใหม่ที่เราตั้งขึ้น
$title->appendChild( $saveXML->createTextNode($s->channel[0]->item[$i]->title));
//สร้าง Element link พร้อมกับดึงค่าเข้าไปเก็บ
$link = $item->appendChild($saveXML->createElement('link'));
$link->appendChild( $saveXML->createTextNode($s->channel[0]->item[$i]->link));
//สร้าง Element author พร้อมกับดึงค่าเข้าไปเก็บ
$author = $item->appendChild($saveXML->createElement('author'));
$author->appendChild( $saveXML->createTextNode($s->channel[0]->item[$i]->author));
$i++;
}
/*
หลังจากที่เราวนลูปอ่านค่าพร้อมทั้งเพิ่มเข้าไปในตัวแปร $saveXML แล้ว ทีนี้ก็จะเป็นขึ้นตอนการบันทึกลงไฟล์
ก่อนอื่นก็ต้อง Formate ก่อนเพื่อให้โค้ดที่ออกมานั้นสวยงาม
*/
$saveXML->formatOutput = true;
$saveXML->save('Summary.xml');
//เป็นอันเสร็จพีธี แค่นี้เราก็สามารถดึงค่าที่เราต้องการออกมาจากไฟล์เอ็กเอ็มแอลเดิมได้แล้วหละ
//อาจจะเอาไปประยุกต์เป็นอย่างอื่นก็ได้เช่นการบันทึกลงฐานข้อมูลเดี๋ยวจะนำเสนอในบทความต่อๆไปน๊ะ

สรุปไฟล์แบบไม่มีคอมเม้น เพื่อให้อ่านได้ง่ายๆก็ดังนี้เลยครับ

<?php
$dom = new domDocument;
$dom->load('filename.xml');
$s = simplexml_import_dom($dom);
$saveXML = new domDocument;
$items = $saveXML->appendChild($saveXML->createElement('items'));
$i=0;
while($s->channel[0]->item[$i]->title) {
$item = $items->appendChild($saveXML->createElement('item'));
$title = $item->appendChild($saveXML->createElement('title'));
$title->appendChild( $saveXML->createTextNode($s->channel[0]->item[$i]->title));
$link = $item->appendChild($saveXML->createElement('link'));
$link->appendChild( $saveXML->createTextNode($s->channel[0]->item[$i]->link));
$author = $item->appendChild($saveXML->createElement('author'));
$author->appendChild( $saveXML->createTextNode($s->channel[0]->item[$i]->author));
$i++;
}
$saveXML->formatOutput = true;
$saveXML->save('Summary.xml');