220 likes | 400 Views
חלק 3: מבוא ל- XPath. XML Path Language. מסמך דוגמא. < bib > < book price =“55”> < publisher >Addison-Wesley</ publisher > < author >Serge Abiteboul</ author > < author > < first-name >Rick</ first-name >
E N D
חלק 3:מבוא ל- XPath XML Path Language
מסמך דוגמא <bib> <bookprice=“55”> <publisher>Addison-Wesley</publisher> <author>Serge Abiteboul</author> <author> <first-name>Rick</first-name> <last-name>Hull</last-name> </author> <author>Victor Vianu</author> <title>Foundations of Databases</title> <year>1995</year> </book> <book> <publisher>Freeman</publisher> <author>Jeffrey D. Ullman</author> <title>Principles of Database and Knowledge Base Systems</title> <year>1998</year> </book> </bib>
מסמך XML כעץ צומת השורש bib צומת המסמך book book price=55 publisher author . . . . Addison-Wesley Serge Abiteboul
ביטויי XPath – דוגמאות פשוטות • /bib/book/year התוצאה: <year>1995</year> <year>1998</year> • /bib/paper/year התוצאה: קבוצה ריקה של צמתים (אין אלמנטים בעלי שם paper)
חיפוש צאצאים (סגור Kleene מוגבל) • //author התוצאה: <author>Serge Abiteboul</author> <author> <first-name>Rick</first-name> <last-name>Hull</last-name> </author> <author>Victor Vianu</author> <author>Jeffrey D. Ullman</author> • /bib//first-name התוצאה: <first-name>Rick</first-name> קבוצה של 4 צמתים
בחירת צמתים שאינם אלמנטים • text()מחזיר צמתים מסוג טקסט • node()מחזיר כל צמת ללא חשיבות לסוגו • הביטוי הבא /bib/book/author/text() מחזיר את שמות הסופרים ששמם נמצא בצומת טקסט אחד. Serge Abiteboul Victor Vianu Jeffrey D. Ullman • הסופר Rick Hull אינו מופיע משום ששמו מופרד לשני אלמנטים, כלומר לאלמנט author לא קיים צומת בן מסוג טקסט.
בחירת אלמנט כלשהו - wildcard • //author/* התוצאה: <first-name>Rick</first-name> <last-name>Hull</last-name> ה-wildcard * במקרה זה בוחר כל צומת אלמנט ללא חשיבות לשמו.
גישה לתכונות • /bib/book/@price התוצאה: “55” ה-@ מתייחס לתכונות ה-@price מתייחס לתכונה price @*מתייחס לתכונה כל שהיא
בחירה לפי ביטויים בוליאניים • /bib/book/author[first-name = “Rick”] התוצאה: <author> <first-name>Rick</first-name> <last-name>Hull</last-name> </author> הביטוי בתוך [ ] דורש כי שמו הפרטי של הסופר הוא Rick. שאלה: כתבו ביטוי המחזיר את כל הספרים מהמילניום הנוכחי? • /bib/book[ year >= 2000] על מנת לבצע את השוואה, הערך הטקסטואלי של צומת year מומר לערך מספרי.
בחירה לפי ביטויים בוליאניים • //book[@price<60][publisher = "Addison-Wesley"] המשמעות של[…][…]היא קיום הביטוי הראשון.מהרשומות שקיבלנו לאחר קיום הביטוי הראשון נדרוש גם קיום הביטוי השני. • התוצאה ? • הביטוי הנ"ל שקול ל- //book[@price<60 and publisher = "Addison-Wesley"] (כפי שנראה בהמשך השקילות לא קיימת כאשר התנאי תלוי בקבוצת הייחוס)
ביטויים בוליאניים קיומיים (existential) • /bib/book/author[first-name][address[zip][city]]/last-name • התוצאה: מוחזרים שמות משפחה (last-name) של סופרים בעלי שם פרטי המופיע בתוך צומת נפרד ובעלי כתובת הכוללת מיקוד (zip) ושם עיר (city). • המשמעות של [first-name] היא הדרישה כי לכל צומת author יש לפחות צומת בן first-name אחד. • שאלה: החזירו סופרים בעלי שם פרטי בלבד (ללא שם משפחה). • /bib/book/author[first-name][not(last-name)]
פונקציות • /bib/book[2] • שקול ל- /bib/book[position() = 2] • פונקציה position() מחזירה את המספר הסידורי של צומת ההקשר בקבוצת הייחוס שלו. • //author[last()] • פונקציה last() מחזירה את מיקום הצומת האחרון בקבוצת הייחוס. • האם שני הביטויים הבאים שקולים? • //author[1][2] • //author[2][1]
פונקציות – דוגמא לשאלת שקילות • נסתכל על הערכים שיוחזרו בדוגמא עבור מסמך הדוגמא • הערכים שיוחזרו עבור //author[1]– הסופר הראשון בכל ספר <author>Serge Abiteboul</author> <author>Jeffery D. Ullman</author> • //author[1][2]לא יחזיר ערכים, מכיוון שבכל צומת בקבוצת הצמתים שהוחזרו ישנו רק סופר אחד • //author[2]שקול ל- //author[2][1] <author> <first-name>Rick</first-name> <last-name>Hull</last-name> </author> מכאן שהביטויים אינם שקולים
פונקציות - המשך • /bib//*[name()=”book”] • שקול ל- /bib//book • name() הינה פונקציה המחזירה את שם הצומת. • /bib/book[count(author)>1] • count() מחזירה את מספר הצמתים בקבוצת הקלט. • id(“a0130353000”) • id() מחזירה את הצמתים בעלי תכונות ID כפי שנתון ע"י הקלט.
XPath – כיווני ניווט (צירים – axes) • ניתן לנוע על פני 13 הכיוונים הבאים: • ancestor::- מכיל אבות קדמונים של צומת ההקשר • ancestor-or-self::- מכיל אבות קדמונים של צומת ההקשר ואת הצומת עצמו • attribute::- מכיל אטריביוטים (תכונות) של צומת ההקשר • child::- מכיל בנים של צומת ההקשר • descendant::- מכיל צאצאים של צומת ההקשר • descendant-or-self::-מכיל צאצאים של צומת ההקשר ואת הצומת עצמו • following::- מכיל צמתים המופיעים אחרי צומת ההקשר במסמך למעט צמתים צאצאים
כיווני ניווט - המשך • following-sibling::- מכיל אחים של צומת ההקשר המופיעים אחריו במסמך • namespace::- מכיל צמתים מסוג namespace של צומת ההקשר • parent::- מכיל את צומת האב (אם קיים) של צומת ההקשר • preceding::- מכיל צמתים המופיעים לפני צומת ההקשר במסמך למעט צמתים שהם אבות קדמונים • preceding-sibling::-מכיל אחים של צומת ההקשר המופיעים לפניו במסמך • self::- מכיל את צומת ההקשר עצמו
דוגמאות //author/descendant-or-self::node()/child::zip ⇔//author//zip ⇔//author/descendant::zip • מה מחזירים הביטויים הבאים? • //book/publisher/parent::*/author • //book[author[position()<last()]] • //book[count(author[1]) = count(author[1] | author[last()] ) ] שני הביטויים עלולים להחזיר תוצאות שונות אם מוסיפים בסוף בחירת מיקום
דוגמאות - המשך • מהם הספרים ששנת ההוצאה שלהם היא המאוחרת ביותר? • //book[ not(year < //book/year) ] • מי הם המחברים אשר כתבו יותר מספר אחד? יש להחזיר כל מחבר כזה פעם אחת בדיוק. • /bib/book/author[.=../following-sibling::*/author and not(.=../preceding-sibling::*/author)]
שאלה ממבחן <!ELEMENT tournament (game*)> <!ELEMENT game (GID, date, player, player, move*)> <!ELEMENT player (name, country, color)> <!ELEMENT move(no, status, piece, from, to)> <!ELEMENT piece(type, color)> • כדי לפשט את הצגת ה-DTD, הניחו כי האלמנטים GID, date, name, country, color, no, status, from, to, type הם מסוג PCDATA. • כתבו שאילתת XPath המוצאת את שם השחקן שביצע הזזת כלי במהלך מספר 7 של משחק מספר 99. על השאילתה למצוא את השחקן על ידי השוואת הצבע שבו הוא משחק לצבע הכלי שהוזז במהלך הנדון.
שאלה ממבחן - פתרון • משחק מספר 99 • //game[GID=99] • הצבע של מהלך מספר 7 במשחק 99 • //game[GID=99]/move[no=7]/piece/color • שם השחקן שביצע את הזזת הכלי במהלך מספר 7 במשחק 99 • //game[GID=99]/player[color = ../move[no=7]/piece/color]/name