ToolDeck

آزمایشگر XPath

عبارات XPath را روی XML آزمایش کنید و همه گره‌های منطبق را ببینید

یک مثال امتحان کنید

ورودی XML

به‌صورت محلی اجرا می‌شود · جای‌گذاری اسرار امن است

XPath چیست؟

XPath (زبان مسیر XML) یک زبان پرس‌وجو برای انتخاب گره‌ها از یک سند XML است. این زبان توسط W3C به عنوان بخشی از استاندارد XSLT تعریف شده است. XPath یک سند XML را به صورت درختی از گره‌ها در نظر می‌گیرد و نحوی مبتنی بر مسیر برای پیمایش آن درخت فراهم می‌کند. عبارتی مانند //book[@category="fiction"]/title هر عنصر title درون عنصر book که ویژگی category آن برابر با "fiction" است را انتخاب می‌کند. نسخه XPath 1.0 که توسط تمام مرورگرهای اصلی و بیشتر کتابخانه‌های XML پشتیبانی می‌شود، در سال ۱۹۹۹ به عنوان توصیه W3C منتشر شد و همچنان پرکاربردترین نسخه است.

عبارات XPath یکی از چهار نوع نتیجه را بازمی‌گردانند: مجموعه‌گره، رشته، عدد یا بولی. مجموعه‌گره رایج‌ترین نتیجه است و شامل صفر یا چند گره XML (عناصر، ویژگی‌ها، گره‌های متنی، نظرات یا دستورالعمل‌های پردازشی) می‌شود. نتایج رشته، عدد و بولی از توابع XPath مانند count()، sum()، contains() و مقایسه‌های بولی به دست می‌آیند. این سیستم نوع، XPath را هم برای استخراج داده و هم برای نوشتن منطق شرطی در صفحات سبک XSLT و اثبات‌های XML Schema مناسب می‌سازد.

عبارات نسخه 1.0 در همه جا کار می‌کنند: document.evaluate() در JavaScript، lxml و ElementTree در Python، javax.xml.xpath در Java، DOMXPath در PHP، و ابزارهای خط فرمان مانند xmllint. نسخه‌های 2.0 و 3.1 سیستم‌های نوع و توابع غنی‌تری اضافه می‌کنند اما به موتورهای اختصاصی مانند Saxon نیاز دارند. به طور پیش‌فرض از نسخه 1.0 استفاده کنید. تنها زمانی به 2.0 یا 3.1 بروید که به دنباله‌ها، عبارات منظم یا توابع مرتبه بالاتر نیاز دارید — و وابستگی به Saxon یا BaseX را بپذیرید.

چرا از آزمایشگر XPath آنلاین استفاده کنیم؟

نوشتن عبارات صحیح نیازمند درک ساختار سند و آزمایش روی داده واقعی است. این ابزار یک محیط تعاملی فراهم می‌کند تا بدون راه‌اندازی پروژه یا نوشتن کد تکراری، روی عبارات تکرار کنید.

آزمایش فوری عبارات
XML خود را الصاق کنید، یک عبارت بنویسید و گره‌های منطبق را بلادرنگ ببینید. نیازی به مرحله کامپایل، راه‌اندازی REPL یا نصب وابستگی نیست.
🔒
پردازش با اولویت حریم خصوصی
تمام تجزیه XML و ارزیابی پرس‌وجو در مرورگر شما با استفاده از APIهای بومی DOMParser و document.evaluate() اجرا می‌شود. داده XML شما هرگز دستگاه شما را ترک نمی‌کند.
🔍
اشکال‌زدایی پرس‌وجوهای پیچیده گام به گام
عبارات طولانی را با آزمایش جداگانه هر محور و شرط تجزیه کنید. ببینید دقیقاً کدام گره‌ها در هر مرحله منطبق می‌شوند تا خطاها را شناسایی کنید.
📋
کپی نتایج برای مستندسازی
گره‌های منطبق یا نتایج عددی را با یک کلیک کپی کنید. برای الصاق در گزارش‌های خطا، اثبات‌های آزمون یا اسکریپت‌های استخراج داده مفید است.

موارد استفاده آزمایشگر XPath

توسعه‌دهنده فرانت‌اند
انتخابگرهای XPath را برای دستکاری SVG یا پیکربندی مبتنی بر XML قبل از جاسازی آن‌ها در کد JavaScript که document.evaluate() را فراخوانی می‌کند، آزمایش کنید.
مهندس بک‌اند
پرس‌وجوها را روی پاسخ‌های SOAP یا بارگذاری‌های XML API قبل از نوشتن منطق استخراج در Python، Java یا Go اعتبارسنجی کنید.
DevOps / زیرساخت
فایل‌های پیکربندی XML (مانند Maven pom.xml، Spring beans، تنظیمات CI pipeline) را پرس‌وجو کنید تا نسخه‌های وابستگی را استخراج یا تنظیمات را بدون ویرایش فایل‌ها تأیید کنید.
تضمین کیفیت / اتوماسیون آزمون
لوکیتورهای XPath را برای Selenium یا Playwright قبل از افزودن به اسکریپت‌های تست بسازید و تأیید کنید. موارد لبه‌ای مانند ویژگی‌های گمشده یا پیشوندهای فضای نام را آزمایش کنید.
مهندس داده
پرس‌وجوها را برای فیدهای XML (RSS، Atom، گزارش‌های مالی XBRL) قبل از اتصال به پایپ‌لاین ETL تست کنید.
دانشجو / یادگیرنده
با محورها، شرط‌ها و توابع XPath با استفاده از XML نمونه آزمایش کنید. نتایج را فوری ببینید تا شهود لازم برای الگوهای پیمایش درخت را به دست آورید.

مرجع محورهای XPath

یک محور جهت پیمایش را نسبت به گره فعلی (زمینه) تعریف می‌کند. نحو کامل axis::node-test[predicate] است، هرچند بیشتر توسعه‌دهندگان از اشکال کوتاه‌شده (//, @, ..) به صورت روزانه استفاده می‌کنند. این جدول تمام محورهای نسخه 1.0 را با مثال‌های کاربردی فهرست می‌کند.

محورمثالتوضیح
childchild::bookDirect children named "book"
descendantdescendant::titleAll "title" elements at any depth
parentparent::*The parent of the current node
ancestorancestor::catalogAll ancestors named "catalog"
following-siblingfollowing-sibling::bookSiblings after the current node
preceding-siblingpreceding-sibling::bookSiblings before the current node
attributeattribute::langThe "lang" attribute of the node
selfself::bookThe current node if it is "book"
descendant-or-self//titleShorthand: any "title" in the tree
ancestor-or-selfancestor-or-self::*Current node plus all ancestors

توابع XPath 1.0

این زبان ۲۷ تابع داخلی را در چهار دسته تعریف می‌کند: مجموعه‌گره، رشته، عدد و بولی. اینها توابعی هستند که هنگام نوشتن پرس‌وجوها بیشتر از همه استفاده خواهید کرد. همه آن‌ها توسط این آزمایشگر و هر پیاده‌سازی سازگار پشتیبانی می‌شوند.

تابعدستهتوضیح
text()Node testSelects text content of a node
position()NumericReturns 1-based position in node set
last()NumericReturns size of current node set
count()NumericCounts nodes: count(//book)
contains()Stringcontains(@class, "active") — substring match
starts-with()Stringstarts-with(title, "The") — prefix match
normalize-space()StringStrips leading/trailing whitespace
string-length()NumericReturns character count of a string
sum()Numericsum(//price) — totals numeric values
not()Booleannot(@disabled) — negation
name()StringReturns element or attribute name

مثال‌های کد

این مثال‌ها نشان می‌دهند چگونه عبارات را به صورت برنامه‌ای ارزیابی کنید. هر قطعه کد از همان ساختار catalog.xml استفاده می‌کند تا بتوانید تفاوت‌های API را در میان زبان‌ها مقایسه کنید.

JavaScript (browser)
const xml = `<catalog>
  <book id="1"><title>1984</title><price>7.99</price></book>
  <book id="2"><title>Dune</title><price>12.99</price></book>
</catalog>`

const parser = new DOMParser()
const doc = parser.parseFromString(xml, 'application/xml')

// Select all book titles
const result = doc.evaluate('//book/title', doc, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null)
let node = result.iterateNext()
while (node) {
  console.log(node.textContent) // → "1984", "Dune"
  node = result.iterateNext()
}

// Get a numeric value
const sum = doc.evaluate('sum(//price)', doc, null, XPathResult.NUMBER_TYPE, null)
console.log(sum.numberValue) // → 20.98
Python (lxml)
from lxml import etree

xml = """<catalog>
  <book id="1"><title>1984</title><price>7.99</price></book>
  <book id="2"><title>Dune</title><price>12.99</price></book>
</catalog>"""

tree = etree.fromstring(xml.encode())

# Select elements by attribute
books = tree.xpath('//book[@id="1"]/title/text()')
print(books)  # → ['1984']

# Use predicates with position
first = tree.xpath('//book[1]/title/text()')
print(first)  # → ['1984']

# Boolean check
has_cheap = tree.xpath('boolean(//price[. < 10])')
print(has_cheap)  # → True
Java (javax.xml.xpath)
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.*;
import org.w3c.dom.*;

var factory = DocumentBuilderFactory.newInstance();
var builder = factory.newDocumentBuilder();
var doc = builder.parse(new java.io.File("catalog.xml"));

var xpath = XPathFactory.newInstance().newXPath();

// Select node set
NodeList titles = (NodeList) xpath.evaluate(
    "//book/title", doc, XPathConstants.NODESET
);
for (int i = 0; i < titles.getLength(); i++) {
    System.out.println(titles.item(i).getTextContent());
    // → "1984", "Dune"
}

// Evaluate to number
double total = (double) xpath.evaluate(
    "sum(//price)", doc, XPathConstants.NUMBER
);
System.out.println(total); // → 20.98
CLI (xmllint)
# Select all book titles
xmllint --xpath '//book/title/text()' catalog.xml
# → 1984Dune

# Select by attribute
xmllint --xpath '//book[@id="2"]/title' catalog.xml
# → <title>Dune</title>

# Count nodes
xmllint --xpath 'count(//book)' catalog.xml
# → 2

# Using xmlstarlet for formatted output
xmlstarlet sel -t -v '//book/title' -n catalog.xml
# → 1984
# → Dune

سوالات متداول

تفاوت بین XPath 1.0 و XPath 3.1 چیست؟
نسخه 1.0 دارای چهار نوع داده (مجموعه‌گره، رشته، عدد، بولی) و ۲۷ تابع است. نسخه 3.1 دنباله‌ها، نگاشت‌ها، آرایه‌ها، انواع تاریخ/زمان، عبارات منظم، توابع مرتبه بالاتر و پشتیبانی از JSON را اضافه می‌کند. مرورگرها و بیشتر کتابخانه‌های استاندارد تنها نسخه 1.0 را پیاده‌سازی می‌کنند. نسخه 3.1 به یک موتور اختصاصی مانند Saxon نیاز دارد.
چگونه گره‌هایی با مقدار ویژگی خاص را انتخاب کنم؟
از یک شرط با نماد اختصاری @ برای محور ویژگی استفاده کنید. به عنوان مثال، //book[@category="fiction"] تمام عناصر book که ویژگی category آن‌ها برابر "fiction" است را انتخاب می‌کند. می‌توانید چندین شرط را ترکیب کنید: //book[@category="fiction"][@year > 2000].
چرا XPath من هیچ نتیجه‌ای بازنمی‌گرداند حتی با اینکه XML حاوی عناصر منطبق است؟
رایج‌ترین علت فضاهای نام XML است. اگر XML شما یک فضای نام پیش‌فرض تعریف کند (xmlns="...")، عناصر حتی بدون پیشوند به آن فضای نام تعلق دارند. در نسخه 1.0 باید فضای نام را ثبت کنید و از یک پیشوند در عبارت خود استفاده کنید. در JavaScript مرورگر، یک حل‌کننده فضای نام را به عنوان آرگومان سوم به document.evaluate() ارسال کنید.
آیا XPath می‌تواند محتوای XML را تغییر دهد؟
خیر. XPath یک زبان پرس‌وجوی فقط‌خواندنی است. گره‌ها را انتخاب و ارزیابی می‌کند اما نمی‌تواند آن‌ها را درج، حذف یا به‌روزرسانی کند. برای تغییر XML از تبدیل‌های XSLT، روش‌های دستکاری DOM یا کتابخانه‌ای مانند lxml پایتون استفاده کنید که APIهای جداگانه‌ای برای ویرایش ارائه می‌دهد.
دو اسلش (//) در XPath به چه معناست؟
دو اسلش نماد اختصاری محور descendant-or-self است. عبارت //title به معنای «انتخاب تمام عناصر title در هر جایی از درخت سند، در هر عمقی» است. معادل فرم کامل /descendant-or-self::node()/title است. استفاده از // در ابتدای عبارت کل سند را جستجو می‌کند؛ استفاده از آن در میان مسیر (مانند /catalog//title) فرزندان یک گره خاص را جستجو می‌کند.
چگونه محتوای متنی را به جای گره عنصر انتخاب کنم؟
/text() را به عبارت خود اضافه کنید. به عنوان مثال، //book/title/text() محتوای متنی هر عنصر title را به صورت یک گره رشته‌ای بازمی‌گرداند، نه خود گره عنصر را. در کد، می‌توانید بدون استفاده از text()، به .textContent روی گره عنصر بازگشتی دسترسی داشته باشید.
آیا XPath از انتخابگرهای CSS برای پرس‌وجوی XML سریع‌تر است؟
انتخابگرهای CSS برای HTML و پیمایش DOM در مرورگرها بهینه شده‌اند. XPath بیانگرتر است: از پیمایش والد، محورهای خواهر-برادر، شرط‌های عددی و توابع داخلی پشتیبانی می‌کند که انتخابگرهای CSS نمی‌توانند بیان کنند. برای HTML انتخابگرهای CSS (querySelector) معمولاً سریع‌تر هستند. برای XML بیشتر کتابخانه‌های سمت سرور تنها XPath را ارائه می‌دهند — انتخابگرهای CSS اصلاً گزینه‌ای نیستند.