
הטקסט המלא של הדקות הראשונות בהרצאה «LINQ ל- XML» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אוקיי, אז בשיעורים הקודמים ראינו לינק טו אובג'קט שבו אנחנו התחברנו לקולקשן פנימי שקיים לנו באפליקציה וביצענו עליו שאילתות כאילו שהוא מסד נתונים.
לאחר מכן ראינו את לינק טו sql שבו התחברנו למסד נתונים sql סרווור, טענו לצד של האפליקציה קולקשנים שמראים את הסכמות של הטבלאות במסד הנתונים ואז עשינו עליהן פעולות על הסכמות של הקולקשנים האלה וכשרצינו לעדכן מסד הנתונים עדכנו אותו בחזרה וכל זה עשינו כמובן על ידי שאילתות לינק. כעת אנחנו הולכים
לראות את לינק טו אקס אמל לינק טו אקס אמל מאפשר לנו לקחת קובץ אקס אמל שתכף אנחנו נחקור בדיוק מה זה ואיך הוא נראה לטעון אותו לצד של האפליקציה ואז לבצע עליו שאילתות אז בואו נראה איך זה מתבצע אז יש לנו פה אפליקציה שוב אנחנו נתעסק כרגע עם קונסול אפליקיישן כך שאם אנחנו נרשום דבר מסוים אנחנו נראה את זה על המסך אם אני אריץ כרגע את
אפליקציה אני פשוט רואה את המילה שרשמתי על מסך שחור שנקרא קונסול. זה מעולה בשביל לבצע בדיקות ולראות איך אנחנו מצליחים לטעון דברים, איך אנחנו מצליחים לבצע תחבירים מסוימים, ולאחר מכן אפשר להשתמש עם זה באתר אינטרנט או בכל אפליקציה אחרת.
אז דבר ראשון שאנחנו הולכים לעשות, אנחנו הולכים לצרף לאפליקציה שלנו קובץ XML. אז בואו נוסיף Existing Item, ונבחר מכל הקבצים שיש בתוך האפליקציה שלנו קובץ XML שהכנתי.
ומראה את כל הארצות עם הערי בירה שלהם. בואו נסתכל עליו ונראה שבעצם כך בנוי קובץ XML. מה שיש לנו זה קודם כל הגדרה כללית לגבי איך קובץ XML מפורמט או יותר נכון הגדרה כללית לגבי זה שהקובץ הנוכחי הוא קובץ XML.
יש לנו פה את הגרסה של הקובץ בינתיים יש רק גרסה 1.0 ויש לנו פה הוא encoding שאומר שהקובץ XML הזה נכתב ב-encoding שנקרא UTF8 שזה בעצם encoding שיכול להכיל כל מיני שפות כמו עברית, ערבית וכולי, למרות שכרגע הקובץ הזה הוא רק באנגלית.
עכשיו קובץ XML מכיל תגית אחת שעוטפת את כל הנתונים שבתוך הקובץ והתגית הזאת נקראת Root Element. מה זה Element? Element זה תגית, זה כמו ב-HTML.
כאן אנחנו רואים שיש לנו תגית שנקראת Country, פה היא נפתחת, כאן היא נסגרת, תגית יכולה להכיל תגיות אחרות כמו country שמכילה שתי תגיות או שתגית יכולה להכיל מידע טקסטואלי ולפעמים תגית מכילה גם תגיות וגם מידע טקסטואלי.
אז כרגע יש לנו רוט אלמנט אחד שנקרא capital cities ובתוכו יש לנו country בתוכו יש לנו name ואז שם המדינה ואז capital של עיר הבירה של המדינה וכך יש לנו כאן את כל המדינות כל מדינה יש לנו name וcapital מה הבירה שלה.
אנחנו עכשיו הולכים בלינק לטעון את הקובץ הזה אל תוך האפליקציה שלנו ואז לבצע עליו פעולות לדוגמה חיפוש לדוגמה הוספה וכולי. שימו לב רק שתגית name זה בעצם תגית child של country, country תגית child של capital cities.
אפשר להגיד גם ש name זה descendant כלומר צאצא של תגית country וכולי. אז בואו נראה איך זה מתבצע. ראשית, מה שאנחנו צריכים לעשות בצד של האפליקציה זה לטעון את הקובץ.
בשביל לטעון את הקובץ אני משתמש במחלקה שנקראת xDocument. בואו נגדיר אותה. נקרא לה ObjectDoc ונטען את הקובץ על ידי הפונקציה xDocument.load.
כעת אנחנו צריכים לאתר בדיוק איפה נמצא הקובץ. בפרויקט ConsoleApplication קובץ ה-Execution שרץ נמצא שתי רמות מתחת לתיקייה של הפרויקט.
כלומר, שתי תיקיות מתחת לתיקייה של הפרויקט. אם נסתכל על זה, אז נראה שקובץ program.cs וקובץ ה-fee-sharp שלנו נמצא בתיקייה של הפרויקט. אני רואה שהוא נמצא בתיקייה של הפרויקט.
אם אני נכנס לתוכו, אני רואה שאני נמצא בתקיעת בין ודיבאג. כאן נמצא קובץ ה-execution שלנו. זאת אומרת שאני צריך לעלות רמה אחת, עוד רמה, ואז להגיע לקובץ ה-XML.
בשביל לעלות רמה, יש לי את הפקודה שתי נקודות. אז אני רושם שתי נקודות, ואז עוד שתי נקודות, ואז מתחבר לקובץ שנקרא CapitalCities.XML.
כעת מה שעשינו זה תאנו את כל הקובץ בבת אחת לתוך אובייקט שנקרא Doc, והוא מטיפוס X-Document שסך הכל מסוגל להחזיק לי עץ אובייקטים שמתאר את קובץ ה-XML.
עכשיו אנחנו מוכנים לבצע שאילתא על המידע שנמצא בתוך האובייקט x-document. אז כאן שוב אנחנו נכנסים לשאילתת לינק ובואו נבנה var query שווה from country in doc.descendant כלומר איזה צאצא אני רוצה לקחת מתוך כל הקובץ ואני רוצה לקחת את הצאצאים שנקראים country ולבצע עליהם שאילתא.
בואו נחפש משהו, where country.element, שזו מילה נרדפת לתגית. אנחנו מחפשים את ה-element name. value זה הערך שנמצא בתוכו, כלומר הטקסט שנמצא בתוך האלמנט.
בואו נהפוך אותו לאותיות קטנות. נחפש את המילה is, כמו ישראל, ועכשיו אני בוחר אלמנט חדש שבו יש לנו name והוא שווה ל-country.element name שנבחר מהקובץ, ואנחנו רוצים את ה-Value שבתוכו ו-Capital שהוא שווה ל-Country, Element, Capital ושוב אנחנו
רוצים את ה-Value שבתוכו. כעת אנחנו יכולים להפוך את זה ל-List, בואו פשוט נרשום var results query to list. עכשיו שימו לב משהו מעניין, אנחנו כתבנו ב-select יצירת טיפוס אנונימי חדש על ידי new, זאת אומרת שהמערכת הולכת ליצור לנו טיפוס חדש, טיפוס נתונים חדש, שבו יש שני מאפיינים name שאנחנו המצאנו פה
טוב יכלנו לתת לזה כל שם חוקי וcapital בגלל שזה טיפוס אנונימי חדש ואין לו שם אז עכשיו אנחנו רואים שכשאני הופך את זה ל-to list אז המערכת אומרת לי אני הולכת להחזיר לך list אבל כל פריט ב-list נקרא גרש a אין שם כזה וסך הכל a זה קיצור של אנונימוס כלומר שם אנונימי שעכשיו הולך לחזור לי לתוך results זאת אומרת שהולך לחזור בעצם
list אבל כל אובייקט ב-list זה אובייקט שיצרנו כאן מטיפוס שאין בעצם לטיפוס הזה שם. בואו נריץ for each על כל הליסט הזאת ונציג את האייטם.
אנחנו יכולים לראות כרגע שחזרו לנו קבוצה של פריטים, שמה שמשותף לכל הפריטים זה שהשם עצמו של כל פריט בקובץ xml מכיל את המילה is. רציתי רק לראות פה את Israel וזה אמור להיות כאן איפשהו.
בואו נסתכל רגע, יש לנו כאן את ארגניסטן, וישראל כאן, הנה השלישית. ישראל, קפיטל שווה ג'רוזלם, כל הפריטים של המדינות חזרו אלינו שהשם שלהם מכיל איז.
בדרך כלל מה שנהוג לעשות זה להגדיר מחלקה שתואמת את המידע בכובד SexML, כך שהמידע יטען בדיוק למחלקה הזאת. בואו נראה איך אפשר לעשות את זה.
אנחנו יכולים ללכת ולהוסיף עוד מחלקה לפרויקט שלנו, ולקרוא למחלקה הזאת country. זאת אומרת שהמחלקה הזאת אמורה לתאר לנו מדינה אחת.
יש לי פה class country ותוך המדינה הזאת יש לנו public string name public string capital ועכשיו יש לי מחלקה שמתארת לי מדינה אחת.
מה אני יכול לעשות? בואו נעשה פה עוד שאילתא, נעתיק את השאילתא הקודמת לשאילתא חדשה, נפריד ביניהם בתצוגה ואנחנו רוצים לבחור משהו אחר אבל להכניס את הנתונים לתוך אובייקטים מהטיפוס שלנו.
בואו נבחר כרגע את כל המדינות שמתחילות ב-a. בואו נגיד במקום contains a, תרצויד a. אבל הפעם אנחנו רוצים ליצור אובייקט מטיפוס ה-country שבנינו. אז יש לנו פה new country.
ברגע שהגדרתי new country ואז הכנסתי את הפרמטרים האלה, אוטומטית ייווצר לי אובייקט מהמחלקה שלנו בליסט.
ואז אני יכול ב-list 2 לרשום list של country, פה אני בעצם יותר שולט על המידע שהולך לחזור. אנחנו רק צריכים לשנות את ה-TooLower מפני שהפכנו אותו כאן לעוד קטנה, אז כמובן שהוא לא יגלה A. בואו נריץ.
וחסר לנו כאן כמובן פונקציית 2-String. בגלל שחסר פונקציית 2-String אז אנחנו רואים שהמערכת מדפיסה לנו את השם של המחלקה עם מרחב השמות.
בואו נחזור למחלקה, נגדיר פונקציית 2-String, נדרוס את פונקציית 2-String הקודמת ונחזיר מחרוזת משלנו. לדוגמא name capital יש לנו פונקציה toString זאת אומרת שאם אנחנו שולחים אובייקט מהמחלקה שלנו ל-right line אוטומטית ה-toString שלו מודפס ואז ה-toString שלנו תודפס ואני רואה כרגע שיש לנו את כל המדינות שמתחילות ב-a
וה-toString שאנחנו הגדרנו מודפס זאת אומרת שמה ששונה בין מה שעשינו עכשיו למה שעשינו מקודם זה סך הכל שאנחנו בחרנו פריטים מטיפוס country שלנו ולא טיפוס אנונימי שהמערכת הגדירה עכשיו מה שנשאר לנו לעשות זה לראות בעצם איך אנחנו מוסיפים מידע חדש לתוך הקובץ.
אז ראשית אנחנו רוצים להגדיר אובייקטים חדשים, לצרף אותם לדוק, כלומר ל-X-דוקיומנט הזה, ואז לשמור את הנתונים בחזרה לקובץ.
כל תגית מיוצגת על ידי אובייקט שנקרא X-אלמנט. אז אני יוצר כרגע אלמנט חדש עבור ה-Name, כי אני רוצה להוסיף מדינה חדשה, ואני צריך בעצם להוסיף גם name חדש, גם capital חדשה וגם country חדשה.
אז בואו נסתכל איך אנחנו עושים את זה. אז יש לי פה x-element l-name שווה new x-element. עכשיו הוא אומר לי באחד הקונסטרקטורים איך אתה רוצה לקרוא לשם של האלמנט.
אנחנו רוצים כרגע שהשם שלו יהיה name, מפני שזה השם של האלמנט בקובץ. עכשיו הוא אומר לי אוקיי, איך אתה רוצה לקרוא למידע שנמצא בתוכו, מה הקונטנט שלו.
ואנחנו רוצים להוסיף מדינה שנקראת אטלנטיס. הדבר הבא שאני רוצה ליצור זה x-element חדש עבור ה-capital. אז ה-content, או יותר נכון השם של ה-element זה capital,