CodeKitHub
כלי קוד

בודק XPath

עודכן לאחרונה:

XPath היא שפת שאילתות לבחירת צמתים ממסמך XML (או HTML) באמצעות ביטויי נתיב, בדומה לאופן שבו נתיב קובץ בוחר קובץ בעץ תיקיות. הכלי הזה מאפשר לכם להדביק כל XML, לכתוב ביטוי XPath ולראות מיד אילו צמתים תואמים — כולל ספירת צמתים, פלט מסודר והודעות שגיאה ברורות עבור XML פגום או תחביר XPath שגוי. הכל רץ לגמרי בדפדפן שלכם באמצעות מנוע `document.evaluate` המובנה בכל דפדפן מודרני, כך שכלום ממה שאתם מדביקים לא נשלח לשום מקום.

מהו הכלי הזה?

XPath (XML Path Language) הוא תקן W3C לניווט ובחירת צמתים — אלמנטים, מאפיינים, טקסט — בתוך מסמך XML באמצעות תחביר קומפקטי דמוי-נתיב, למשל `//book[price>30]/title` בוחר כל `<title>` שאלמנט האח שלו `<price>` גדול מ-30, בכל מקום במסמך. הוא משמש גיליונות סגנון XSLT, כלי אימות XML, כלי גריפת אתרים, מסגרות אוטומציה לדפדפן (Selenium, Playwright) וספריות XML של שפות תכנות רבות.

הגרסה הנוכחית המיושמת על ידי כל הדפדפנים המרכזיים — Chrome, Firefox, Safari, Edge — היא XPath 1.0, ההמלצה המקורית של W3C משנת 1999. הכלי הזה משתמש באותו מנוע מקורי בדיוק דרך ה-API `document.evaluate()` של הדפדפן, כך שהתוצאות כאן תואמות למה שהייתם מקבלים מכלי הפיתוח של הדפדפן או מכל קוד JavaScript שרץ בדפדפן. הוא אינו מיישם את מפרטי XPath 2.0/3.0/3.1 המאוחרים יותר (אלה מוסיפים פונקציות כמו `for`, רצפים והתאמת regex) — ראו את השאלות הנפוצות למשמעות המעשית של כך.

ביטוי יכול להחזיר אחד משני סוגי תוצאות: קבוצת צמתים (node-set — אפס או יותר אלמנטים, מאפיינים או צמתי טקסט תואמים, אותם הכלי מסדר ומציג שורה אחת לכל צומת עם ספירה), או ערך סקלרי — מספר, מחרוזת או ערך בוליאני — כאשר הביטוי עצמו מחשב ערך, כמו `count(//book)` או `//book[1]/title = 'Dune'`.

למה להשתמש בו?

  • לנפות שגיאות בביטוי XPath לפני שמטמיעים אותו בקוד קשיח בתוך כלי גריפה, בדיקת Selenium/Playwright, או גיליון סגנון XSLT.
  • לבדוק במהירות האם XPath נתון בוחר את הצומת המצופה מתוך דוגמת XML/HTML אמיתית.
  • לראות ספירות התאמה מדויקות ופלט מסודר במקום לנחש מתוך הקוד.
  • לקבל שגיאות מיידיות וברורות עבור XML פגום או תחביר XPath לא תקין, במקום מעקב מחסנית מבלבל.
  • עובד כולו בצד הלקוח: ה-XML והביטוי שלכם לעולם לא עוזבים את הדפדפן.

איך להשתמש

  1. הדביקו או ערכו את ה-XML (או HTML) שלכם בתיבת הקלט — מסמך חנות ספרים לדוגמה כבר ממולא מראש כדי שתוכלו לראות אותו פועל מייד.
  2. הקלידו ביטוי XPath בשדה הביטוי, או ערכו את הדוגמה הממולאת מראש.
  3. לחצו על "Evaluate" (או הקישו Enter בשדה הביטוי).
  4. קראו את הצמתים שהתאימו למטה, עם ספירה בראש; תוצאות סקלריות (מספרים, מחרוזות, ערכים בוליאניים) מוצגות ישירות.
  5. אם ה-XML או הביטוי אינם תקינים, הודעת שגיאה ספציפית מחליפה את התוצאות.

דוגמה

קלט

XML:
<bookstore>
  <book><title>The Great Gatsby</title><price>12.99</price></book>
  <book><title>Learning XPath</title><price>34.50</price></book>
  <book><title>Dune</title><price>45.00</price></book>
</bookstore>

XPath: //book[price>30]/title

פלט

✓ 2 node(s) matched
<title>Learning XPath</title>
<title>Dune</title>

רק ל-2 מתוך 3 הספרים יש מחיר מעל 30, כך שבדיוק 2 אלמנטים מסוג <title> מוחזרים — הספר השלישי (Gatsby, 12.99$) מוצא בצדק בחוץ.

XPath מול בוררי CSS במבט חטוף

שתי השפות בוחרות צמתים ממסמך, אך הן פותרות בעיות שונות. השתמשו בטבלה הזו כדי לבחור את הכלי הנכון לבחירה נתונה.

יכולתXPathבוררי CSS
בחירה לפי תג/מחלקה/מזהה כלפי מטהכןכן — ובדרך כלל מהיר יותר
בחירה לפי תוכן טקסט גלויכן — `contains(text(),'x')`לא
מעבר כלפי מעלה להורה/אב קדמוןכן — `//div[span]/..`לא (`:has()` הוא חריג חלקי חדש יותר)
השוואת ערכים בין אחים (למשל `price>30`)כןלא
פועל מחוץ לדפדפן (כלי XML בצד השרת, XSLT)כןלא — בוררי CSS ספציפיים לדפדפן/DOM

כלים קשורים

עובדים עם פורמטים של נתונים מובנים? הכלים האלה משתלבים היטב עם בדיקת XPath.

שאלות נפוצות

למה משמש XPath?

XPath בוחר צמתים — אלמנטים, מאפיינים או טקסט — מתוך מסמך XML או HTML באמצעות תחביר נתיב. זוהי שפת הבחירה שמאחורי טרנספורמציות XSLT, כלי אימות XML רבים, והיא נפוצה מאוד בגריפת אתרים ובאוטומציית בדיקות דפדפן (Selenium, Playwright, Cypress) לאיתור אלמנטים בעמוד, במיוחד כאשר בוררי CSS לבדם אינם יכולים לבטא את התנאי הנדרש.

XPath לעומת בוררי CSS — במה כדאי להשתמש?

הם חופפים חלקית אך אינם שווי ערך. XPath יכול לבחור הורה בהתבסס על תוכן של ילד (`//div[span='Total']`), לעלות כלפי מעלה לאבות קדמונים, ולבחור לפי טקסט גלוי (`//button[contains(text(),'Submit')]`) — בוררי CSS אינם יכולים לעלות כלפי מעלה בעץ ואינם יכולים להתאים לפי תוכן טקסט בכלל. אם אתם רק בוחרים לפי תג, מחלקה או ID תוך ירידה במסמך, בוררי CSS פשוטים יותר לכתיבה ובדרך כלל מהירים יותר להערכה. פנו ל-XPath במיוחד כשאתם צריכים "לבחור את ההורה של הטקסט הזה" או "לבחור לפי מה שהאלמנט אומר", ולא רק לפי מה שהוא מתויג או מסווג אליו.

האם הכלי הזה תומך בפונקציות XPath 2.0 או 3.0?

לא — וגם אף דפדפן לא תומך. דפדפנים מיישמים XPath 1.0 (המלצת W3C משנת 1999) דרך `document.evaluate()`, והכלי הזה משתמש באותו מנוע מקורי בדיוק, כך שהוא מדויק למה שהייתם מקבלים בהרצת אותו ביטוי בכלי הפיתוח של הדפדפן או ב-JavaScript. פונקציות ותכונות שהוצגו ב-XPath 2.0/3.0/3.1 (כמו ביטויי `for`, רצפים, או `matches()` עם regex) אינן זמינות — כאן פועלות רק פונקציות של גרסה 1.0 כגון `contains()`, `starts-with()`, `substring()`, `count()`, `position()` ו-`last()`.

אילו ביטויי XPath נפוצים כדאי לי להכיר?

`//tag` בוחר כל `<tag>` בכל מקום במסמך. `//tag[@attr='value']` בוחר אלמנטי `<tag>` שהמאפיין `attr` שלהם שווה ל-`value`. `//tag[contains(text(),'x')]` בוחר אלמנטי `<tag>` שהטקסט הישיר שלהם מכיל את `x`. `//tag[1]` בוחר את אלמנט ה-`<tag>` הראשון מבין האחים בכל הורה. `//parent/child` בוחר אלמנטי `<child>` שהם ילדים ישירים של `<parent>`. `count(//tag)` מחזיר מספר במקום קבוצת צמתים.

האם הכלי הזה תומך במרחבי שמות של XML?

רק המקרה הנפוץ ללא מרחב שמות נתמך כראוי, וזה מכסה את הרוב המכריע של XML/HTML כתובים ידנית או שנגרפו. אם המסמך שלכם מכריז על מרחב שמות XML (למשל `xmlns="..."` באלמנט השורש), `document.evaluate` דורש פונקציית resolver מודעת למרחבי שמות שממפה קידומות ל-URI-ים, מה שהכלי הפשוט הזה אינו מגדיר — ביטויים כנגד XML עם מרחבי שמות עלולים להחזיר אפס התאמות גם כשהם נראים נכונים. זו מגבלה ידועה, לא באג: הסירו את הכרזת מרחב השמות מהדוגמה שלכם, או השתמשו בפונקציית local-name() כפתרון עוקף (למשל `//*[local-name()='title']`).

האם ה-XML או ביטוי ה-XPath שלי נשלחים לשרת?

לא. הכל רץ באופן מקומי באמצעות `DOMParser` ו-`document.evaluate()` המובנים של הדפדפן שלכם — אותו מנוע שהדפדפן שלכם כבר משתמש בו באופן פנימי. שום דבר שתקלידו או תדביקו לעולם לא עוזב את המכשיר שלכם.