Home > PHP, XML > มาอ่าน XML แบบง่ายๆ ด้วย SimpleXML

มาอ่าน XML แบบง่ายๆ ด้วย SimpleXML

จำได้มั้ยครับ สมัยก่อนเวลาเราจะอ่าน xml โดยใช้ php ที ต้องไปใช้คำสั่งตระกูล xml_parser ที่แสนวุ่นวาย มาจน PHP5 เพิ่มคำสั่ง simplexml มา และแล้วทุกอย่างก็เปลี่ยนไปตลอดกาล….

คำสั่ง simplexml เป็น extension ที่เริ่มมีมาใน PHP5 นี้เอง ชุดคำสั่งสามารถช่วยเราจัดการ xml ได้อย่างสบายมือ หยั่งกะท่อง array ^^ วันนี้ผมจะมา อธิบายแค่ชุดคำสั่งที่ใช้ในการ read เท่านั้นก่อน จะได้ไม่เป็นการยากเกินไป

เอาละเบื้องต้นหา xml เป้าหมายกันก่อน เอาเป็น hi5 นี่ล่ะว้า คนเล่นเยอะดี

  1. <?php
  2. $url = "http://api.hi5.com/rest/feed/albumlist/106835745";
  3. $xmlBase = file_get_contents($url);
  4. // SimpleXML ไม่ชอบ xml ในรูปแบบ <atom:field> เราจึง replace มันออกไปก่อน
  5. $xmlstr = preg_replace("/(<\/?)(\w+):([^>]*>)/", "$1$2$3", $xmlBase);
  6.  
  7. // วนลูปโดยทำการชี้ ไปที่ชุดที่เราต้องการได้เลย
  8. foreach ($xml->atomentry as $item)
  9. {
  10.   // ทำการดึง content ออกมา
  11.   echo $item->atomcontent."
  12. ";
  13. }
  14. ?>

เพียงเท่านี้ครับ ง่ายมั้ยล่ะ นอกจากนี้ simplexml ยังมีของวิเศษอีกชิ้นนึง นั่นก็คือ xpath ครับ

xpath เป็นตัวที่ทำให้เราข้ามชุดข้อมูลที่เราไม่ต้องการได้ทันทีเลย

เช่นผมมี xml ตามแบบด้านล้างนี้

  1. <?php
  2. $string = <<<XML
  3. <a>
  4.  <b>
  5.   <c>text</c>
  6.   <c>stuff</c>
  7.  </b>
  8.  <d>
  9.   <c>code</c>
  10.  </d>
  11. </a>
  12. XML;
  13. ?>

ผมสามารถที่จะเข้าถึง ข้อมูลชุด c ได้เลย โดยเขียนแบบนี้

  1. $xml = new SimpleXMLElement($string);
  2. $result = $xml->xpath(’b/c’);

หรือขี้เกียจหนักเลยผมจะใช้แบบนี้ก็ยังได้

  1. $result = $xml->xpath(’//c’);

ไม่ต้องเสียเวลามาไล่ทีละชั้นเหมือน array

นอกจากนี้ยังมีคำสั่งที่ต้องศึกษาเพิ่มเติมกันเอาอีกนิดหน่อยครับ คือพวกนี้

SimpleXMLElement->asXML
SimpleXMLElement->attributes
SimpleXMLElement->children

ปล. ตัวอย่างที่ผมเขียนให้ถ้าเอาไปศึกษาดีๆ สามารถดูรูปคนที่เค้าตั้งไว้ไม่ให้ดูด้วยนะ อิอิ ^^

แบบนี้ไงล่ะ
http://xxx.jquerytips.com/SimpleXML/readATOM.php?userId=xxxxxx

ใส่ userId ของคนที่คุณอยากดูลงไป วุ ฮ่า ฮ่า ฮ่า

Tee++; PHP, XML

  1. puri
    July 9th, 2008 at 13:08 | #1

    ขอโค้ดไฟล์
    http://xxx.jquerytips.com/SimpleXML/readATOM.php

    หน่อยสิครับ จะนำไปพัฒนาต่อ

    ขอบพระคุณอย่างสูง

  2. oxygen
    July 17th, 2008 at 15:14 | #2

    ขอบคุณความรู้ดีๆมาครับทำให้ผมผ่านปัญหาที่ติดอยู่เป็นวันได้ ขอบคุณจริงๆครับ

  3. zunkz
    July 20th, 2008 at 16:40 | #3

    โห โดนใจ อยากได้ บ้างอะ เฮีย -_-” แจกไหมน๊า

  4. zunkz
    July 20th, 2008 at 18:28 | #4

    Warning: Invalid argument supplied for foreach() in /home/www/virtual/xxxx.com/htdocs/ee.php on line 8

    foreach ($xml->atomentry as $item) atomentry as $item)

  5. u
    July 28th, 2008 at 01:32 | #5

    ใช้ไม่ได้ครับ

  6. Nui
    July 29th, 2008 at 01:38 | #6

    แจ่มมากครับ ไม่ทราบว่าพอจะมีวิธีที่ทำให้ดูข้อความของเพื่อน(ไม่ใช่ Comment)ใน Hi5 ได้ป่าวครับ

  7. jQuery Newbie
    July 31st, 2008 at 14:59 | #7

    ในตัวอย่าง atomentry กับ atomcontent คืออะไรหรอครับ ช่วยยกตัวอย่างที มันขึ้นเหมือที่คุณ zunkz บอกอ่ะครับ

  8. xlife
    August 24th, 2008 at 00:12 | #8

    สวัสดีครับเราสามารถดึง คน online
    ออกมาได้รึป่าวครับ

    เช่น ในฐานข้อมูลของเรา ของสมาชิกแต่ละคน จะมีเก็บ hi5 ของแต่ละคนไว้

    ถ้าเราต้องการดึงสมาชิกของเราและที่ออนไล hi5 อยู่ด้วย มาแสดงที่หน้าเว็ปเราโดนเป็น username ของเว็ปเรา อะครับ

    http://api.hi5.com/rest_presence.getOnlineFriends.html

  9. LhaR
    January 25th, 2009 at 10:18 | #9

    สวัสดีค่ะ
    พอจะทราบไหมค่ะว่าจะแก้ไข หรือ ลบ ข้อมูลใน xml ยังไงอะค่ะ
    ดึงข้อมูลมาดูแสดงบนหน้าเว็บได้ แต่ไม่รู้วิธีแก้ไขข้อมูลแล้วบันทึกกลับไปยัง xml ไฟล์เดิมอะค่ะ
    ช่วยหน่อยนะค่ะ จนปัญญาแล้วอะค่ะ
    ขอบคุณมากค่ะ

  10. January 25th, 2009 at 14:39 | #10

    ปกติผมไม่ค่อยจะตอบผ่าน Comment หรอกนะครับ แต่เอาเป็นว่าวันนี้จะตอบให้ละกันครับ

    การ Edit หรือ Modify XML นั้นก็เหมือนปกติ คือเราจะต้องอ่านมาก่อน

    ถ้าใช้เป็น Simple XML เราจะทำการแก้ไข ประมาณนี้
    $xml = new SimpleXMLElement($xmlstr);
    $xml->book[0]->characters->character[0]->name = ‘Big Cliff’;
    echo $xml->asXML();

    แต่ถ้าเป็น DOM จะอ่านออกมาตรงจุดที่ต้องการแลเวใช้คำสั่งพวก AppendChild , CreateTextNode และต่างๆ จากนั้น Save กลับด้วย
    $test1 = $dom->saveXML();
    $dom->save(’test1.xml’)

    ประมาณนี้ล่ะ

  1. July 14th, 2008 at 23:39 | #1