پارسر XML

پارس اسناد XML در PHP و جاوااسکریپت — SimpleXML و DOMParser

پارسر چیست؟

پارسر XML برنامه‌ای است که متن XML را می‌خواند و به ساختاری قابل استفاده در برنامه تبدیل می‌کند. دو رویکرد اصلی وجود دارد:

رویکردتوضیحمناسب برای
درختی (Tree)کل سند یک‌جا در حافظه به‌صورت درخت بارگذاری می‌شود (DOM)اسناد کوچک و متوسط، نیاز به پیمایش آزاد
رویدادی (Event)سند به‌صورت جریانی خوانده می‌شود و با هر عنصر رویداد صادر می‌شود (SAX)اسناد حجیم، حافظه محدود

SimpleXML در PHP

ساده‌ترین راه پارس XML در PHP:

$xml = simplexml_load_file("books.xml");
// یا از رشته:
// $xml = simplexml_load_string($xmlString);

// دسترسی به عنصر مثل پراپرتی شی!
echo $xml->book[0]->title;        // عنوان اولین کتاب
echo $xml->book[1]->price;        // قیمت کتاب دوم

// ویژگی‌ها مثل آرایه
echo $xml->book[0]['category'];

// پیمایش همه کتاب‌ها
foreach ($xml->book as $book) {
    echo $book->title . " - " . $book->price . PHP_EOL;
}
SimpleXML فوق‌العاده شهودی است: عنصرها مثل پراپرتی (->title) و ویژگی‌ها مثل ایندکس آرایه (['category'])!

SimpleXML با XPath

$xml = simplexml_load_file("books.xml");

// کتاب‌های گران‌تر از ۳۰
$expensive = $xml->xpath("/bookstore/book[price>30]");

foreach ($expensive as $book) {
    echo $book->title . PHP_EOL;
}

DOMParser در جاوااسکریپت

در مرورگر، پارس XML با DOMParser:

const text = '<note><to>Ali</to><from>Sara</from></note>';
const parser = new DOMParser();
const xmlDoc = parser.parseFromString(text, "text/xml");

xmlDoc.getElementsByTagName("to")[0].textContent;  // "Ali"

بررسی خطاهای پارس

const xmlDoc = parser.parseFromString(text, "text/xml");
const errorNode = xmlDoc.querySelector("parsererror");

if (errorNode) {
    console.error("خطای XML:", errorNode.textContent);
}
در جاوااسکریپت، سند XML خطادار استثنا پرتاب نمی‌کند! به‌جای آن یک عنصر <parsererror> در نتیجه قرار می‌دهد — حتماً آن را بررسی کنید.

پارس رویدادی (SAX) — مفهومی

پارسرهای SAX مثل Expat در PHP، سند را خط‌به‌خط می‌خوانند و برای هر رویداد (شروع عنصر، پایان عنصر، متن) تابع callback شما را صدا می‌زنند:

// شروع عنصر → onStartElement("book", ["category" => "web"])
// متن        → onText("XML Guide")
// پایان عنصر → onEndElement("book")

مزیت: حافظه بسیار کم — کل سند هرگز یک‌جا در حافظه نیست. عیب: پیمایش معکوس و دسترسی تصادفی ممکن نیست.

کدام را انتخاب کنیم؟

این مبحث بخشی از دوره آموزش کامل XML است.

ابزارهای مرتبط