یک تفاوت عمده میان دادههای XML و دادههای بانکهای اطلاعات رابطهای وجود دارد. در بانکهای اطلاعات رابطهای وجود یک زبان استاندارد برای پرسوجو مانند SQL علاوه بر این که مقبولیت عام را بدست آورده است، برای تمامی پرسوجوها در این پایگاههای داده کاربرد دارد. ولی در دنیای XML قضیه فرق میکند. زبانهای پرسوجوی زیادی مانند XML-QL ، XPath ، XQuery و XQL [۱۱] وجود دارند، که هیچ کدام از اینها نتوانستهاند به عنوان یک استاندارد کلی برای همگان مقبولیت عام داشته باشند. حتی W3C نیز نتوانسته یکی از این زبانها را به عنوان زبان پرسوجوی رسمی در سندهای XML مطرح نماید. ولی برای کسانی که با XML کار میکنند دو زبان XQuery [23] و XPath [24] آشناتر و پذیرش گستردهتری داشته است. ما در ادامه بهطور مختصر این دو زبان را شرح میدهیم.
زبان پرسوجوی XPath
در این زبان برای انتخاب هر داده از یک سند XML، از عبارت مسیری متناظر با آن داده استفاده میشود. ساختار این زبان بیشتر شبیه به آدرسدهی فایلها در محیط سیستم عامل میباشد. هر عبارت مسیری دنبالهای از مراحل است که از المان ریشه شروع شده و با / از هم جدا میشوند و نتیجه آن مجموعه مقادیر (المانها یا صفات) متناظر با آن مسیر خواهد بود. هر مرحله از عبارت مسیری، روی نتیجه مرحله قبل عمل میکند. برای نمونه به پرسوجوی زیر دقت کنید.
Root//a /b /c[@age=25]
این پرسوجو به دنبال cهایی میگردد که دارای صفتی بنام age با مقدار ۲۵ باشند و همچنین این cها فرزند b و نوه a که این گره نیز نسلی از گره ریشه است، باشند.
توابع و عملگرهای زیادی در XPath پشتیبانی میشوند (مثل تابع count() ). با استفاده از نماد گذاری مرسوم در سیستم فایلهای سیستم عامل، میتوانیم به هر یک از گرههای فرزند، پدر، همزاد، جد یا نوه گره مرحله قبل برویم. مثلاً با // که معنی پرش از چندین مرحله را میدهد میتوان تمام نوههای یک گره را بدست آورد و یا .. که پدر یک گره را نشان میدهد و مشابه اینها.
زبان پرسوجوی XQuery
این زبان بیشتر شبیه به SQL است و برای برنامهنویسان آشناتر است. ساختار یک پرسوجو در زبان XQuery (به نام عبارت FLWOR)، شامل بخشهای زیر میباشد:
For … Let … Where … Order by … Return …
For، Where و Return به ترتیب معادل عبارات From، Where و Select در زبان SQL هستند و Let که معادلی در SQL ندارد، برای تعریف متغییرهای موقتی لازم بکار میرود. در بخش For از عبارات مسیری استفاده میشود و نتیجه محاسبه شده آنرا در یک متغیر میریزند. با کمک بخشهای Whereو Letداده خاص مورد نظر را از این متغیر جدا کرده و این داده را در عبارت Return، توسط برچسبهای مناسب و در قالب مورد نظر برمیگردانند.
توابع زیادی از جمله distinct()(برای حذف جوابهای تکراری)، count()، sum()و … در XQuery قابل استفاده میباشند. در XQuery عملگر گروهبندی (group by) پشتیبانی نمیشود اما میتوان با استفاده از عبارت FLWOR درون عبارت Return (یعنی FLWOR تودرتو)، جوابهای محاسبه شده را مطابق آنچه که خواسته شده است گروهبندی نمود.
برای مثال کد ذکر شده در مثال قبل را به زبان XQuery مینویسیم.
For $c in a/b/c
Let $a := $c/@age
Where $c/age =25
Return <c>$a</c>