ToolDeck

مختبر XPath

اختبر تعبيرات XPath على XML وشاهد جميع العقد المطابقة

جرب مثالاً

إدخال XML

يعمل محليًا · آمن للصق الأسرار

ما هو XPath؟

XPath (لغة مسار XML) هي لغة استعلام لتحديد العقد من مستند XML. حدّدها اتحاد W3C ضمن معيار XSLT، وتتعامل مع مستند XML باعتباره شجرة من العقد، وتوفّر صياغة مسارية للتنقل في تلك الشجرة. فمثلاً، التعبير //book[@category="fiction"]/title يختار كل عنصر title داخل عنصر book تكون قيمة سمة category فيه مساوية لـ "fiction". تُعدّ النسخة 1.0، المدعومة من جميع المتصفحات الرئيسية ومعظم مكتبات XML، نسخةً صادرة كتوصية W3C عام 1999 وتبقى الأوسع انتشاراً حتى اليوم.

تُعيد تعبيرات 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 وتقييم الاستعلامات بالكامل في متصفحك باستخدام واجهتَي 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) لاستخراج إصدارات الاعتماديات أو التحقق من الإعدادات دون تعديل الملفات.
ضمان الجودة / أتمتة الاختبارات
أنشئ محددات 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

تعرّف اللغة 27 دالة مدمجة موزعة على أربع فئات: مجموعة العقد، والنص، والرقم، والقيمة المنطقية. هذه هي الدوال الأكثر استخداماً عند كتابة الاستعلامات، وجميعها مدعومة من هذا المختبر ومن كل تطبيق متوافق.

الدالةالفئةالوصف
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 ذاتها حتى تتمكن من مقارنة الفوارق بين الواجهات البرمجية عبر اللغات المختلفة.

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 أربعة أنواع بيانات (مجموعة العقد، والنص، والرقم، والقيمة المنطقية) و27 دالة. تضيف النسخة 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؟
لا. إنها لغة استعلام للقراءة فقط. تختار العقد وتُقيّمها لكنها لا تستطيع إدراجها أو حذفها أو تحديثها. لتعديل XML استخدم تحويلات XSLT أو مناهج معالجة DOM أو مكتبة كـ lxml في Python التي توفر واجهات برمجية منفصلة للتحرير.
ماذا تعني الشرطتان المائلتان (//) في XPath؟
الشرطتان المائلتان اختصار لمحور descendant-or-self. يعني التعبير //title «اختر جميع عناصر title في أي مكان من شجرة المستند وعلى أي عمق.» وهو ما يعادل الصيغة الكاملة /descendant-or-self::node()/title. استخدام // في بداية التعبير يبحث في المستند بأكمله، أما في منتصف المسار (كـ /catalog//title) فيبحث في فروع عقدة محددة.
كيف أختار محتوى النص بدلاً من عقدة العنصر؟
أضف /text() إلى نهاية تعبيرك. فمثلاً، //book/title/text() يُعيد محتوى النص لكل عنصر title كعقدة نصية، بدلاً من عقدة العنصر ذاتها. يمكنك أيضاً الوصول إلى .textContent على عقدة العنصر المُعادة في الشيفرة البرمجية دون استخدام text().
هل XPath أسرع من محددات CSS لاستعلام XML؟
محددات CSS مُحسَّنة لـ HTML والتنقل في DOM داخل المتصفحات. XPath أكثر تعبيراً: يدعم التنقل نحو الأصل، ومحاور الأشقاء، والأوصاف العددية، والدوال المدمجة التي لا تستطيع محددات CSS التعبير عنها. بالنسبة لـ HTML، تكون محددات CSS (querySelector) أسرع عادةً. أما بالنسبة لـ XML فمعظم مكتبات جانب الخادم لا تُتيح إلا XPath — ولا تُعدّ محددات CSS خياراً أصلاً.