Presentation is loading. Please wait.

Presentation is loading. Please wait.

1 236363 מערכות מסדי נתונים 8. שפת החיפוש XPath שקפים:אלדר פישר.

Similar presentations


Presentation on theme: "1 236363 מערכות מסדי נתונים 8. שפת החיפוש XPath שקפים:אלדר פישר."— Presentation transcript:

1 1 236363 מערכות מסדי נתונים 8. שפת החיפוש XPath שקפים:אלדר פישר

2 2 מהי XPath XPath היא שפת שאילתות המאפשרות לבחור קבוצה של צמתים מתוך מסמך XML. זוהי שפה פשוטה יחסית (אולם רחוקה מטריוויאלית) לניווט במבנה העץ של המסמך ובחירה מתוכו. בד"כ שפה זו משמשת כרכיב בשפות מורכבות יותר, כגון שפת השאילתות XQuery ושפת תרגום המסמכים XSLT, כשם ששפת הביטויים הרגולרים משמשת כרכיב ב-DTD.

3 3 מקטע DTD לדוגמא עבור הדוגמאות ב-XPath, נניח שהמסמך שלנו מציית ל-DTD המכיל (בין השאר) את ההכרזות הבאות: <!ATTLIST imagefile CDATA #REQUIRED heightCDATA #IMPLIED widthCDATA #IMPLIED> כאשר לא מצויין אחרת, אנו נניח שהבן היחידי של שורש המסמך הוא צומת אלמנט עם תווית book.

4 4 Xpath  תחביר בסיסי התחביר הבסיסי של ביטויי XPath מזכיר את זה של בחירת קבצים במערכות הפעלה. דוגמא: עבור מסמך המכיל תיאור של ספר יחיד (תחום בתגים … ) הביטוי הבא יתאר את כל תתי הפרקים בספר: /book/chapter/section. באופן פורמלי: סימן " / " פירושו שתת-הביטוי מימין לסימן מתאר חיפוש, שיש לבצעו בתתי העץ הנקבעים ע"י הצמתים המתוארים בתת-הביטוי שמשמאל לסימן ה-" / ". סימן ה-" / " השמאלי ביותר פירושו שהחיפוש הכולל מתחיל מצומת השורש.

5 5 חיפוש צאצאים (סגור Kleene מוגבל) שני סימני " / " רצופים פירושם שאת הצמתים המתוארים בתת- הביטוי מימין לסימן יש לחפש החל מהצאצאים של הצמתים המתוארים משמאל לסימן, ולא רק מהבנים. דוגמאות: –חיפוש של כל צמתי התמונה במסמך : //image –בהנחה שהמסמך כולו מכיל תיאור של ספר יחיד, איך נחפש כותרים של פרקים ותתי-פרקים בלבד ? /book/chapter//title –עבור מסמכים שיכולים להכיל מספר ספרים במספר רמות, איך נחפש את כל התמונות המופיעות בהם ? //book//image

6 6 בחירת צמתים שאינם אלמנטים התחביר הבסיסי מתאים לבחירת צמתי אלמנט בלבד. אם נרצה להתייחס לצמתי תכונות, נשתמש בסימן "@": לדוגמא, הביטוי /book//image/@file ייתן את שמות כל הקבצים המשמשים עבור תמונות בספר. על מנת להתייחס לצמתי טקסט, נשתמש במילה השמורה “text()”. זכרו שלצמתים אלו אין תוויות. דוגמא: לבחירת הטקסט של כותרת הספר (ללא ה-“ … ” מסביב לטקסט) ניתן להשתמש בביטוי /book/title/text().

7 7 בחירת צומת כל שהוא (wildcard) המילה השמורה "node()" מתאימה לכל צומת של המסמך הממוקמת במקום המתאים במסלול החיפוש, פרט לתכונות. הסימן "  " פירושו כל צומת אלמנט הממוקם במסלול החיפוש (ליתר דיוק, הפירוש הוא "כל הצמתים מטיפוס ציר החיפוש הנוכחי", אולם ברב המקרים טיפוס זה הוא של צמתי האלמנט). דוגמא: /book//paragraph/node()  ייתן את התוכן של כל הפסקאות בספר (קטעי טקסט, צמתי הדגשה ותמונות). /book//paragraph/   ייתן את ההדגשות והתמונות בכל הפסקאות בספר. הצירוף "@  " פירושו כל צמתי התכונות במסלול החיפוש. לדוגמא: /book//image/@   ייתן את כל התכונות של כל התמונות בספר.

8 8 בחירה של צומת לפי מספר הביטוי /book/chapter[3] יבחר את צומת הפרק השלישי בספר. באופן כללי: אם נצמיד לתווית של צומת בחיפוש מספר k (או ביטוי אריתמטי שתוצאתו היא מספר k), אז התשובה תהיה הצומת ה-k בעל תווית זו. הסדר נקבע לפי סדר הצמתים במסמך. הבחירה נעשית מחדש עבור כל אפשרות של מסלול חיפוש חלקי עד הצומת הלפני אחרונה. לדוגמא, אילו באותו מסמך היו מאוחסנים מספר ספרים, אז /book/chapter[3] היה מחזיר את הפרק השלישי מכל ספר במסמך שיש לו פרק כזה.

9 9 ביטויים נוספים ב-XPath ב-XPath ניתן גם לכתוב ביטויים המחזירים ערך מספרי, או ערך בוליאני, או מחרוזת, ולא רק קבוצה של צמתים. ביטויים כאלה יכולים להיות שימושיים בשפה המארחת, ולעיתים משתמשים בהם כתתי-ביטוי של ביטויי חיפוש, לצורך בחירת צומת לפי מספר, או (כפי שנראה בהמשך) לפי תנאי בוליאני.

10 10 אופרטורים ב-XPath ניתן להשתמש בביטויי XPath באופרטורים הבאים: אופרטורים אריתמטים: +, -, , div (לחילוק, במקום הסימן " / "), mod (שארית בחלוקה של שלמים). השוואות:, =, =, =!. מחברים בוליאנים: and, or. איחוד בין שתי קבוצות צמתים מתבצע ע"י האופרטור " | " ניתן להשתמש בביטויי חיפוש המתחילים ב-" / " או " // ", ובביטויי בחירה בתוך " [... ] " אשר נראה בהמשך, כאופרטורים על קבוצת צמתים המתוארת בביטוי משמאלם. XPath מגדירה גם מספר פונקציות. חלק מהן נראה בהמשך.

11 11 בחירה לפי ביטוי בוליאני ניתן להשתמש בביטוי בוליאני בתוך " [... ] " על מנת לבחור מקבוצת הצמתים רק את אלו המקיימים את התנאי. הביטוי /book/chapter[title=“Introduction”] יבחר רק את הפרקים שבהם יש צומת “title” המכיל את הטקסט “Introduction”. מדוע השתמשנו ב-“title” ולא ב-“title/text()” ? ב-XPath צמתים מתורגמים למחרוזות לפי הצורך, ובתרגום זה סימני התיוג מוסרים.

12 12 מסלולי חיפוש יחסיים ביטויי חיפוש ב-XPath שאינם מתחילים ב-" / " מתארים חיפוש שאינו מתחיל בשורש המסמך. מהיכן החיפוש יתחיל ? הדבר תלוי בהקשר (context) של הביטוי. בעת ביצוע ביטוי XPath, תוכנת העיבוד מקבלת יחד עם הביטוי נתונים נוספים, ובהם את צומת ההקשר. נתונים אלו מסופקים ע"י השפה המארחת, ובמקרה שבו מדובר בתת-ביטוי של ביטוי XPath מורכב יותר, ההקשר ניתן ע"י XPath עצמו. דוגמא: ניזכר בביטוי /book/chapter[title=“Introduction”]. צומת ההקשר עבור תת-הביטוי title=“Introduction” יהיה צומת הפרק המתאים שעבורו התנאי נבדק.

13 13 פונקציות מיקום הפונקציה position() (ללא פרמטרים) נותנת את המיקום היחסי של צומת ההקשר בתוך קבוצת הייחוס שלו. לדוגמא, הביטוי /book/chapter[position()=3] שקול לביטוי /book/chapter[3]. הפונקציה last() מחזירה את מיקום הצומת האחרון בקבוצת הייחוס של צומת ההקשר. לדוגמא, הביטוי /book/chapter/section[last()] יחזיר את תת- הפרק האחרון בכל פרק של הספר.

14 14 פונקציות נוספות עבור קבוצות צמתים הפונקציה count(arg) תחזיר את מספר הצמתים בקבוצה המתוארת ע"י ביטוי החיפוש arg. דוגמא: הביטוי /book/chapter[count(section)>2] יחזיר את כל פרקי הספר עם יותר מ-2 תתי-פרקים. הפונקציה id(arg) תחזיר את הצומת בעל תכונת ה-ID הזהה לביטוי arg. –אם arg הוא מחרוזת עם רווחים, יבוצע חיפוש עבור כל "מילה" במחרוזת. –אם arg הוא קבוצת צמתים, הם יתורגמו למחרוזות שיפורקו ל- "מילים", ועבור כל אלו יבוצע חיפוש. דוגמא: עבור העץ הגנאולוגי שתואר בהרצאה הקודמת, כך נוכל לדעת לאלו אנשים יש בנות: //person[id(@children)/@gender=“female”]

15 15 פונקציות אחרות ב-XPath מוגדרות גם מספר פונקציות שימושיות נוספות. למשל: –פונקציות תרגום הערכים number(…), boolean(…), string(…). –פונקציות להרכבת ובדיקת מחרוזות, כגון contains(…), concat(…). –פונקציות בוליאניות ומספריות כגון floor(…), sum(…), not(…). משמעות הפונקציות תינתן בתרגילים ובדפי קריאה.

16 16 עוד על השוואות ב-XPath במקרים שבהם אנו משווים בין שני ערכים מסוגים שונים, יתבצע תרגום אוטומטי של הערכים לפי הקריטריונים הבאים: ההשוואות =, > : הערכים המושווים יתורגמו במידת האפשר למספרים לצורך ההשוואה. שימו לב שמחרוזות שאינן מייצגות מספרים יגרמו כאן לתוצאה לא צפויה. ההשוואות =, =! : התרגום יתבצע לפי סדר העדיפויות הבא. –אם לפחות אחד הערכים הוא בוליאני (למשל תוצאה של השוואה אחרת, או של אחת הפונקציות false(), true() ), אז גם הערך השני יתורגם לערך בוליאני. –אם אחד הערכים הוא מספר והשני הוא מחרוזת, אז המחרוזת תתורגם גם היא למספר. –אם שני הערכים מחרוזות, תתבצע ביניהם השוואה.

17 17 השוואות וקבוצות צמתים בהשוואה כל שהיא בין ערך לקבוצה של צמתים (הנתונה ע"י ביטוי חיפוש), ההשוואה תקבל ערך אמת “true()” אם ורק אם קיים צומת כל שהוא בקבוצה, שלאחר תרגומו לערך מהסוג המתאים ההשוואה המתאימה תתקיים. דוגמא: הביטוי //image/@width>32 יחזיר “true()” אם קיימת במסמך תמונה אחת לפחות עם רוחב מוצהר הגדול מ-32. בהשוואה בין שתי קבוצות צמתים, זו תקבל ערך “true()” אם ורק אם קיים זוג צמתים  אחד מכל קבוצה, כך שבתרגומם לערכים ההשוואה המתאימה תתקיים. הביטוי /book/chapter[1]//image/@file=/book/chapter[2]//image/@file יחזיר ערך “true()” אם קיים לפחות קובץ תמונה אחד משותף בין שני הפרקים.

18 18 ניווט מתקדם ב-XPath כל הביטויים שלמדנו עד עתה תיארו חיפושים בעץ המסמך במסלול יורד מהשורש, מאב לבן (עם אפשרות ל"דילוג" כאשר משתמשים ב-"//"). ב-XPath ניתן גם לתאר מסלולי חיפוש הכוללים כיוונים אחרים. הדבר נעשה באמצעות ציון "כיוון" הצומת המבוקש (ביחס לצומת הקודם שהגענו אליו) במפורש. book chapter section book chapter section

19 19 ציון כיוון מפורש (axis) ציון הכיוון ניתן בין סימן ה-"/" לבין תווית הצומת הבא. כאשר אין ציון כזה, ברירת המחדל היא מעבר לבן. במפורש כותבים זאת “child::”. דוגמא  הביטוי /book/chapter שקול לביטוי /child::book/child::chapter. הפניה לצומת תכונה נחשבת גם היא לציון כיוון. לדוגמא, הביטוי //image/@file שקול לביטוי //image/attribute::file, כאשר “attribute::” הוא ציון הכיוון המפורש של תכונה. ציון כיוון החיפוש נקרא ציר  axis.

20 20 ציוני כיוון של צאצאים descendant::  מציין כל צאצא אפשרי של הצומת הנוכחי. descendant-or-self::  מציין כל צאצא אפשרי וכן את הצומת עצמו. השימוש ב-"//" שקול בעצם לשימוש ב- “/descendant-or-self::node()/” השימוש ב-"//" לא תמיד שקול אולם לציר “descendant::”. ניתן לראות את ההבדל בדוגמא הבאה: /book/descendant::image[1]  ייתן את התמונה הראשונה בספר. /book//image[1]  ייתן את התמונה הראשונה בכל פסקה בספר המכילה תמונה (ה-"[1]" יהיה ביחס לצומת האב של צומת ה- image).

21 21 בחירה עצמית ובחירת הורה הציר self:: מציין את הצומת עצמו. לדוגמא, לבחירת כל צמתי הכותרת שאינם הקדמה נוכל לכתוב /book//title[self::title!=“Introduction”] הציר parent:: מציין את אבי הצומת. הביטוי /book/chapter/parent::book יבחר את הספר עצמו, אבל רק אם יש בו פרקים. בקשר לצירים אלו קיימים סימונים מקצרים נוחים, המזכירים את אלו המשמשים במערכות הפעלה. “./” הוא סימון מקוצר ל-“self::node()/” “../” הוא סימון מקוצר ל-“parent::node()/”

22 22 חיפוש לפי אחים הציר following-sibling:: מציין את האחים של הצומת הנמצאים אחריו במסמך. לצורך זה, צמתי תכונות נחשבים כחסרי אחים. דוגמא: הביטוי /book/chapter[title=“Introduction”]/following-sibling::chapter ייתן את כל צמתי הפרקים לאחר פרק ההקדמה. הציר preceding-sibling:: מציין את האחים של הצומת (לא כולל תכונות) הנמצאים לפניו במסמך. דוגמא: הביטוי הבא ייתן את כל הפרקים לפני האפנדיקס: /book/chapter[title=“Appendix”]/preceding-sibling::chapter

23 צירים הפוכים הציר preceding-sibling:: הוא ציר הפוך: בניגוד לצירים האחרים, לכל מסלול חיפוש עד להגעה לציר זה, סדר הצמתים בתת הקבוצה המתאימה לצעד החיפוש של הציר יהיה בסדר הפוך לסדר המסמך. דוגמא: הביטוי הבא ייתן את הפרק האחרון לפני האפנדיקס: /book/chapter[title=“Appendix”]/preceding-sibling::chapter[1] לעומת זאת, הביטוי הבא כבר ייתן את הפרק הראשון  שינוי הסדר כבר אינו בתוקף בעקבות השימוש באופרטור על קבוצת הצמתים הכוללת. (/book/chapter[title=“Appendix”]/preceding-sibling::chapter)[1] ב-XPath 2.0 גם הציר parent:: הוא הפוך. ב-XPath 1.0 אין הדבר משנה כי תתי הקבוצות שהציר אמור להפוך יכולות להיות בנות צומת אחד לכל היותר.

24 24 מצייני כיוון נוספים למציאת האבות הקדמונים של צומת, עם או בלי הצומת עצמו (צירים הפוכים)ancestor-or-self:: ancestor:: למציאת כל הצמתים במסמך לאחר הצומת הנוכחי, פרט לצאצאים ותכונותfollowing:: למציאת כל הצמתים לפני הצומת הנוכחי, פרט לאבות הקדמונים ותכונות (ציר הפוך)preceding:: למציאת הכרזות על "מרחבי שמות", namespaces (לא נלמד) namespace::

25 25 XPath  מילות סיכום שפת החיפוש XPath מאפשרת גמישות רבה בהגדרת מסלולי חיפוש לבחירת קבוצות של הצמתים במסמך XML נתון. שפה זו משתלבת ב-XSLT, ובאופן הדוק אף יותר ב-XQuery, בעת ביצוע הפעולות המוגדרות בהן על קבוצות.


Download ppt "1 236363 מערכות מסדי נתונים 8. שפת החיפוש XPath שקפים:אלדר פישר."

Similar presentations


Ads by Google