เรียนรู้เกี่ยวกับส่วนขยาย SimpleXML ที่มาพร้อมกับ PHP เวอร์ชัน 5 ซึ่งช่วยให้เพจ PHP สามารถสืบค้น ค้นหา แก้ไข และเผยแพร่ XML อีกครั้งในรูปแบบที่เป็นมิตรกับ PHP
PHP เวอร์ชัน 5 เปิดตัว SimpleXML ซึ่งเป็น Application Programming Interface (API) ใหม่สำหรับการอ่านและเขียน XML ใน SimpleXML นิพจน์ต่อไปนี้:
$doc->rss->channel->item->title
เลือกองค์ประกอบจากเอกสาร สำนวนนี้เขียนได้ง่ายตราบใดที่คุณคุ้นเคยกับโครงสร้างของเอกสาร อย่างไรก็ตาม หากยังไม่ชัดเจนว่าองค์ประกอบที่จำเป็นปรากฏที่ใด (เช่น ใน Docbooks, HTML และเอกสารการเล่าเรื่องที่คล้ายกัน) SimpleXML สามารถใช้นิพจน์ XPath เพื่อค้นหาองค์ประกอบเหล่านี้ได้
เริ่มต้นใช้งาน SimpleXML
สมมติว่าคุณต้องการเพจ PHP เพื่อแปลงฟีด RSS เป็น HTML RSS เป็นรูปแบบ XML อย่างง่ายสำหรับการเผยแพร่เนื้อหาที่เชื่อมโยง องค์ประกอบรากของเอกสารคือ RSS ซึ่งมีองค์ประกอบช่อง องค์ประกอบช่องประกอบด้วยข้อมูลเมตาเกี่ยวกับฟีด เช่น ชื่อ ภาษา และ URL นอกจากนี้ยังมีรายงานต่างๆ ที่ห่อหุ้มไว้ในองค์ประกอบรายการอีกด้วย แต่ละรายการมีองค์ประกอบลิงก์ซึ่งมี URL และชื่อหรือคำอธิบาย (โดยปกติจะเป็นทั้งสองอย่าง) ซึ่งมีข้อความธรรมดา ไม่มีการใช้เนมสเปซ RSS มีอะไรมากกว่านั้นอย่างแน่นอน แต่นั่นก็เพียงพอแล้วสำหรับบทความนี้ รายการ 1 แสดงตัวอย่างทั่วไปซึ่งมีรายการข่าวสองรายการ
รายการ 1. RSS feed
<?xml version="1.0" encoding="UTF-8"?>
<rss รุ่น = "0.92">
<ช่อง>
<title>มอกคา มิต ชแลก</title>
<link>http://www.elharo.com/blog</link>
<ภาษา>th</ภาษา>
<รายการ>
<title>สถานีเพนน์: ไปแล้วแต่ยังไม่ถูกลืม</title>
<คำอธิบาย>
สถานีเพนน์เก่าในนิวยอร์กถูกรื้อทิ้งก่อนที่ฉันจะเกิด
เมื่อดูภาพเหล่านี้แล้วรู้สึกเหมือนเกิดข้อผิดพลาด
มีประโยชน์ใช้สอย แต่ไม่มีอีกแล้ว จริงๆ แล้วมีเพียงอาคารสำนักงานและใต้ดินเท่านั้น
ทางเดินที่ไม่มีความสนใจหรือความสวยงามเป็นพิเศษ เมดิสันสแควร์แห่งใหม่...
</คำอธิบาย>
<link>http://www.elharo.com/blog/new-york/2006/07/31/penn-station</link>
</รายการ>
<รายการ>
<title>ส่วนตัวของเอลเลียต ฮาโรลด์</title>
<description>บางคนใช้ตัวกรองสแปมที่น่ารังเกียจและต้องการคุณ
เพื่อพิมพ์สตริงสุ่มในเรื่องของคุณ เช่น E37T เพื่อผ่าน
ไม่จำเป็นต้องพูดว่าฉันและคนอื่น ๆ ส่วนใหญ่ไม่สนใจที่จะสื่อสารด้วย
พวกหวาดระแวงเหล่านี้แสดงปฏิกิริยามากเกินไปต่อปัญหาสแปม
โดยส่วนตัวแล้วฉันจะไม่...</description>
<link>http://www.elharo.com/blog/tech/2006/07/28/personal-for-elliotte-harold/</link>
</รายการ>
</ช่อง>
</rss>
มาพัฒนาเพจ PHP เพื่อจัดรูปแบบฟีด RSS ให้เป็น HTML กันดีกว่า รายการ 2 แสดงโครงสร้างพื้นฐานของหน้านี้
รายการ 2. โครงสร้างคงที่ของโค้ด PHP
<?php // โหลดและแยกวิเคราะห์เอกสาร XML ?>
<html xml:lang="en" lang="en">
<หัว>
<title><?php // ชื่อจะถูกอ่านจาก RSS ?></title>
</หัว>
<body>
<h1><?php // ชื่อจะถูกอ่านจาก RSS อีกครั้ง ?></h1>
<?php
// ที่นี่เราจะใส่การวนซ้ำเพื่อรวมชื่อและคำอธิบายของแต่ละรายการ
?>
</ร่างกาย
>
</html>
การแยกวิเคราะห์เอกสาร XML
ขั้นตอนแรกคือการแยกวิเคราะห์เอกสาร XML และบันทึกลงในตัวแปร สิ่งที่คุณต้องทำคือโค้ดหนึ่งบรรทัด โดยส่ง URL ไปยังฟังก์ชัน simplexml_load_file():
$rss = simplexml_load_file('http://partners.userland.com/nytRss/nytHomepage.xml');
สำหรับตัวอย่างนี้ ฉันได้สร้างหน้าเว็บจากฟีด New York Times ของ Userland (ที่ http://partners.userland.com/nytRss/nytHomepage.xml ) แน่นอนว่าคุณสามารถใช้ URL ใด ๆ ไปยังฟีด RSS อื่นได้
โปรดทราบว่าแม้ว่าชื่อจะเป็น simplexml_load_file() แต่ฟังก์ชันนี้จะแยกวิเคราะห์เอกสาร XML บน HTTP URL ระยะไกล แต่นั่นไม่ใช่สิ่งเดียวที่แปลกเกี่ยวกับฟังก์ชันนี้ ค่าที่ส่งคืน (ซึ่งเก็บไว้ในตัวแปร $rss) ไม่ได้ชี้ไปที่เอกสารทั้งหมด ดังที่คุณอาจคาดหวังได้หากคุณใช้ API อื่น เช่น Document Object Model (DOM) แต่จะชี้ไปที่องค์ประกอบรูทของเอกสารแทน เนื้อหาของเอกสารอารัมภบทและบทส่งท้ายไม่สามารถเข้าถึงได้จาก SimpleXML
ค้นหาชื่อฟีด
ชื่อของฟีดทั้งหมด (ไม่ใช่ชื่อของเรื่องราวแต่ละเรื่องในฟีด) จะอยู่ในหัวข้อย่อยของช่ององค์ประกอบรูท rss ง่ายต่อการค้นหาหัวเรื่องราวกับว่าเอกสาร XML เป็นรูปแบบอนุกรมของอ็อบเจ็กต์คลาส rss โดยที่ช่องช่องสัญญาณนั้นมีช่องหัวเรื่องด้วย การใช้ไวยากรณ์อ้างอิงวัตถุ PHP ปกติคำสั่งเพื่อค้นหาชื่อจะเป็นดังนี้
$title = $rss->channel->title;
เมื่อพบแล้ว ก็สามารถเพิ่มลงในเอาต์พุต HTML ได้ การทำเช่นนี้เป็นเรื่องง่าย เพียงสะท้อนตัวแปร $title:
<title><?php echo $title; ?></title>
บรรทัดนี้ส่งออกค่าสตริงขององค์ประกอบแทนที่จะเป็นองค์ประกอบทั้งหมด กล่าวคือเนื้อหาข้อความถูกเขียนขึ้นแต่ไม่รวมแท็ก
คุณสามารถข้ามตัวแปรกลาง $title ได้อย่างสมบูรณ์:
<title><?php echo $rss->channel->title; ?></title>
เนื่องจากเพจนี้นำค่านี้ไปใช้ซ้ำในหลายที่ ฉันจึงพบว่าการเก็บไว้ในตัวแปรที่มีความหมายชัดเจนจะสะดวกกว่า
-