GORAGOD.com

การแยกข้อความ XML ด้วย PHP

จริงๆแล้วการ parse XML ด้วย PHP มีฟังก์ชั่นของ PHP ให้เลือกใช้ได้อยู่แล้วโดยไม่ต้องไปหาฟังก์ชั่นอื่น แต่ผมไม่ได้เลือกใช้ฟังก์ชั่นของ PHP ในการทำงานหรอกครับ เนื่องจากผมพบว่าบ่อยครั้งที่บาง Server ไม่ได้เปิดใช้ฟังก์ชั่นในกลุ่มนี้ไว้ หากใครสนใจลองไปดูได้ที่ http://th2.php.net/...nual/en/book.xml.php ครับ

การ parse เอกสาร XML โดยเฉพาะในเอกสาร ที่รู้ node ของ XML ที่แน่นอนนั้น เราอาจใช้ฟังก์ชั่นในกลุ่ม preg เพื่อแยกข้อมูลได้ครับ

ตัวอย่างเอกสาร XML ผม save ไว้ในชื่อ address.xml ครับ

<ADDRESS>
   <NAME>Goragod Wiriya</NAME>
   <COMPANY>Goragod.com</COMPANY>
   <GENDER>male</GENDER>
   <EMAIL>goragod@yahoo.com</EMAIL>
</ADDRESS>

การอ่านเอกสารด้านบน สามารถทำได้ง่ายๆ ดังนี้ครับ

<?php
   $xml = file_get_contents( 'address.xml' ); // อ่านไฟล์ XML
   preg_match('/<NAME>(.*?)<\/NAME>/isu',$xml,$name); // อ่าน NAME
   echo '<br />name:: '.$name[1];
   preg_match('/<COMPANY>(.*?)<\/COMPANY>/isu',$xml,$company); // อ่าน COMPANY
   echo '<br />company :: '.$company[1];
   preg_match('/<EMAIL>(.*?)<\/EMAIL>/isu',$xml,$email); // อ่าน EMAIL
   echo '<br />email :: '.$email[1];
?>

ปกติแล้วถ้าหากว่าเอกสาร XML ที่จะอ่านมี NODE ที่แน่นอน ก็สามารถอ่านได้ง่ายๆตามวิธีด้านบนครับ แต่หากเอกสาร XML มีความซับซ้อนมากขึ้น เช่น อาจมี prpoerty ก็อาจต้อมากำหนด pattern ที่เหมาะสมให้กับ preg_match เพื่ออ่านค่าออกมาครับ เช่น

หากมี node ในรูปแบบ

<NAME type="sername">Goragod Wiriya</NAME>

เราก็อาจจัด pattern ได้ว่า

<?php
     preg_match('/<NAME.*?>(.*?)<\/NAME>/isu' , '<NAME type="sername">Goragod Wiriya</NAME>', $match);
     echo '<br />name :: '.$match[1];
?>