John Squirrels
רָמָה
San Francisco

XML ב-Java

פורסם בקבוצה
היי! היום נציג פורמט נתונים נוסף בשם XML. זה נושא חשוב מאוד. כשעובדים על יישומי Java אמיתיים, כמעט בוודאות תיתקלו במשימות הקשורות ל-XML. בפיתוח Java משתמשים בפורמט הזה כמעט אוניברסלית (נגלה למה בהמשך), אז אני ממליץ לא לסקור את השיעור הזה בצורה שטחית, אלא להבין הכל לעומק וגם ללמוד ספרות/קישורים נוספים :) זה בהחלט לא יהיה בזבוז זמן. אז בואו נתחיל עם הדברים הקלים: ה"מה" וה"למה"!

מה זה Java XML?

XML ראשי תיבות של eXtensible Markup Language. אולי אתה כבר מכיר שפת סימון - האם שמעתם על HTML, המשמש ליצירת דפי אינטרנט :) מה זה XML?  - 1HTML ו-XML אפילו בעלי מראה דומה:
HTML 1
<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
XML 1
<headline>title</headline>
<paragraph>paragraph<paragraph>
<paragraph>paragraph<paragraph>
HTML 2
<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
XML 2
<chief>title</chief>
<paragraph>paragraph<paragraph>
<paragraph>paragraph<paragraph>
במילים אחרות, XML היא שפה לתיאור נתונים.

למה אתה צריך XML?

XML הומצא במקור כדי לאחסן ולשלוח נתונים בצורה נוחה יותר, כולל דרך האינטרנט. יש לזה כמה יתרונות שעוזרים לך להשיג זאת. ראשית, קל לקרוא אותו גם על ידי אדם וגם על ידי מחשב. אני חושב שאתה יכול להבין בקלות מה קובץ ה-XML הזה מתאר:
<?xml version="1.0" encoding="UTF-8"?>
<book>
   <title>Harry Potter and the Philosopher’s Stone</title>
   <author>J. K. Rowling</author>
   <year>1997</year>
</book>
מחשב גם מבין בקלות את הפורמט הזה. שנית, מכיוון שהנתונים מאוחסנים כטקסט רגיל, לא יהיו בעיות תאימות כאשר נעביר אותם ממחשב אחד למשנהו. חשוב להבין ש-XML אינו קוד בר הפעלה - זו שפת תיאור נתונים. לאחר שתאר נתונים באמצעות XML, עליך לכתוב קוד (לדוגמה, ב-Java) שיכול לשלוח/לקבל/לעבד את הנתונים האלה.

איך בנוי XML?

המרכיב העיקרי הוא תגים: אלה הדברים בסוגריים זווית:
<book>
</book>
יש תגיות פתיחה ותגיות סגירה. לתג הסגירה יש סמל נוסף (" / "), כפי שניתן לראות בדוגמה למעלה. לכל תג פתיחה חייב להיות תג סוגר. הם מראים היכן מתחיל ומסתיים התיאור של כל רכיב בקובץ. ניתן לקנן תגיות! בדוגמה של הספר שלנו, לתג <book> יש 3 תגים מקוננים: <title>, <author> ו-<year>. זה לא מוגבל לרמה אחת של קינון: לתגים מקוננים יכולים להיות תגים מקוננים משלהם, וכו'. מבנה זה נקרא עץ תגים. בואו נסתכל על העץ הזה באמצעות קובץ XML לדוגמה המתאר סוכנות רכב:
<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
</carstore>
כאן יש לנו תג ברמה העליונה: <carstore>. זה נקרא גם אלמנט שורש. ל-<carstore> יש תג צאצא אחד: <car>. ל-<car>, בתורו, יש גם 3 תגיות ילדים: <model>, <year> ו-<price>. לכל תג יכולות להיות תכונות, המכילות מידע חשוב נוסף. בדוגמה שלנו, לתג <model> יש תכונה "lang", אשר מציינת את השפה המשמשת לרישום שם הדגם:
<model lang="en">Scania R 770</model>
כאן אנו מציינים שהשם כתוב באנגלית. לתג <price> שלנו יש תכונה "מטבע".
<price currency="US dollar">150000.00</price>
כאן אנו מציינים שמחיר המכונית ניתן בדולרים. לפיכך, ל-XML יש תחביר "מתאר את עצמו". אתה יכול להוסיף כל מידע שאתה צריך כדי לתאר את הנתונים. בנוסף, בחלק העליון של הקובץ, ניתן להוסיף שורה המציינת את גרסת ה-XML ואת הקידוד המשמש לכתיבת הנתונים. זה נקרא "פרולוג" והוא נראה כך:
<?xml version="1.0" encoding="UTF-8"?>
אנו משתמשים ב-XML גרסה 1.0 ובקידוד UTF-8. זה לא הכרחי, אבל זה יכול להיות שימושי אם, למשל, הקובץ שלך משתמש בטקסט בשפות שונות. הזכרנו ש-XML פירושו "שפת סימון הרחבה", אבל מה המשמעות של "ניתן להרחבה"? זה אומר שהוא מושלם ליצירת גרסאות חדשות של האובייקטים והקבצים שלך. לדוגמה, נניח שאנחנו רוצים להתחיל למכור גם אופנועים בסוכנות הרכב שלנו! עם זאת, אנחנו צריכים את צרכי התוכנית שלנו לתמוך בשתי הגרסאות של <carstore>: הישנה (ללא אופנועים) והחדשה. הנה הגרסה הישנה שלנו:
<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
</carstore>
והנה המורחב החדש:
<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
   <motorcycle>
       <title lang="en">Yamaha YZF-R6</title>
       <year>2018</year>
       <price currency="Russian Ruble">1000000.00</price>
       <owner>Vasia</owner>
   </motorcycle>
   <motorcycle>
       <title lang="en">Harley Davidson Sportster 1200</title>
       <year>2011</year>
       <price currency="Euro">15000.00</price>
       <owner>Petia</owner>
   </motorcycle>
</carstore>
עד כדי כך קל ופשוט להוסיף תיאור של אופנועים לקובץ שלנו :) מה גם שממש לא צריך שיהיו לנו תגי ילדים זהים לאופנועים כמו למכוניות. שימו לב שלאופנועים, בניגוד למכוניות, יש אלמנט <owner>. זה לא מונע מהמחשב (או האדם) לקרוא את הנתונים.

הבדלים בין XML ל-HTML

כבר אמרנו ש-XML ו-HTML מאוד דומים במראה. לכן חשוב מאוד לדעת איך הם שונים. ראשית, הם משמשים למטרות שונות. HTML מיועד לסימון דפי אינטרנט. לדוגמה, בזמן יצירת אתר אינטרנט, אתה יכול להשתמש ב-HTML כדי לציין: "התפריט צריך להיות בפינה הימנית העליונה. צריך להיות בו כפתורים כאלה ואחרים". במילים אחרות, תפקידו של HTML הוא להציג נתונים. XML מיועד לאחסון ושליחת מידע בצורה נוחה לבני אדם ולמחשבים. פורמט זה אינו מכיל כל אינדיקציה כיצד יש להציג את הנתונים הללו: זה תלוי בקוד של התוכנית שקוראת אותם. שנית, יש הבדל טכני גדול. תגי HTML מוגדרים מראש. במילים אחרות, יצירת כותרת HTML (לדוגמה, כיתוב גדול בראש העמוד) משתמשת רק בתגיות <h1></h1> (בשימוש <h2></h2> ו-<h3></h3> עבור כותרות קטנות יותר). אינך יכול ליצור כותרות HTML באמצעות תגים אחרים. XML אינו משתמש בתגים מוגדרים מראש. אתה יכול לתת לתגים כל שם שתרצה: <header>, <title>, <idontknow2121>.

פתרון סכסוכים

החופש ש-XML מספק יכול להוביל לבעיות מסוימות. לדוגמה, ישות אחת ויחידה (לדוגמה, מכונית) יכולה לשמש תוכנית למטרות שונות. לדוגמה, יש לנו קובץ XML שמתאר מכוניות. עם זאת, המתכנתים שלנו לא הגיעו להסכמה מוקדמת בינם לבין עצמם. ועכשיו, בנוסף לנתונים על מכוניות אמיתיות, אנו עשויים למצוא נתונים על מכוניות צעצוע ב-XML שלנו! יתר על כן, יש להם אותן תכונות. נניח שהתוכנית שלנו קוראת בקובץ XML כזה. איך נבדיל מכונית אמיתית ממכונית צעצוע?
<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">100.00</price>
   </car>
</carstore>
כאן קידומות ומרחב שמות יעזרו לנו. על מנת להבחין בין מכוניות צעצוע למכוניות אמיתיות בתוכנית שלנו (ואכן כל צעצוע מעמיתיהם האמיתיים), אנו מציגים שתי קידומות: "אמיתי" ו"צעצוע".
<real:car category="truck">
   <model lang="en">Scania R 770</model>
   <year>2005</year>
   <price currency="US dollar">200000.00</price>
</real:car>
<toy:car category="sedan">
   <title lang="en">Ford Focus</title>
   <year>2012</year>
   <price currency="US dollar">100.00</price>
</toy:car>
כעת התוכנית שלנו תוכל להבחין בין הישויות השונות! כל מה שיש לו את קידומת הצעצוע יטופל כצעצועים :) עם זאת, עדיין לא סיימנו. כדי להשתמש בקידומות, עלינו לרשום כל אחת מהן כמרחב שמות. למעשה, "להרשם" היא מילה חזקה :) אנחנו פשוט צריכים להמציא שם ייחודי לכל אחד מהם. זה כמו בשיעורים: לכיתה יש שם קצר ( Cat ) ושם מלא הכולל את כל החבילות ( zoo.animals.Cat ). URI משמש בדרך כלל ליצירת שם מרחב שמות ייחודי. לפעמים זה נעשה באמצעות כתובת אינטרנט, שבה מתוארות הפונקציות של מרחב השמות הזה. אבל זה לא חייב להיות כתובת אינטרנט חוקית. לעתים קרובות מאוד, פרויקטים פשוט משתמשים במחרוזות דמויות URI שעוזרות לעקוב אחר היררכיית מרחב השמות. הנה דוגמא:
<?xml version="1.0" encoding="UTF-8"?>
<carstore xmlns:real="http://testproject.developersgroup1.companyname/department2/namespaces/real"
         xmlns:toy="http://testproject.developersgroup1.companyname/department2/namespaces/toy">
<real:car category="truck">
   <model lang="en">Scania R 770</model>
   <year>2005</year>
   <price currency="US dollar">200000.00</price>
</real:car>
<toy:car category="sedan">
   <title lang="en">Ford Focus</title>
   <year>2012</year>
   <price currency="US dollar">100.00</price>
</toy:car>
</carstore>
כמובן, אין אתר בכתובת "http://testproject.developersgroup1.companyname/department2/namespaces/real" אבל המחרוזת הזו מכילה מידע שימושי: המפתחים של קבוצה 1 במחלקה 2 אחראים ליצירת מרחב השמות ה"אמיתי" . אם נצטרך להציג שמות חדשים או לדון בסכסוכים אפשריים, נדע לאן לפנות. לפעמים מפתחים משתמשים בכתובת אינטרנט תיאורית אמיתית כשם מרחב שמות ייחודי. לדוגמה, זה יכול להיות המקרה של חברה גדולה שהפרויקט שלה ישמש מיליוני אנשים ברחבי העולם. אבל זה בהחלט לא נעשה תמיד: ב-Stack Overflow יש דיון בנושא הזה. באופן כללי, אין דרישה קפדנית להשתמש ב-URI כשמות מרחבי שמות: אתה יכול גם פשוט להשתמש במחרוזות אקראיות. אפשרות זו תעבוד גם:
xmlns:real="nvjneasiognipni4435t9i4gpojrmeg"
עם זאת, לשימוש ב-URI יש מספר יתרונות. אתה יכול לקרוא עוד על זה ממש כאן .

תקני XML בסיסיים

תקני XML הם קבוצה של הרחבות המוסיפות פונקציונליות נוספת לקובצי XML. ל-XML יש הרבה תקנים, אבל רק נסתכל על החשובים שבהם ונגלה שהם מאפשרים את AJAX, שהוא אחד מתקני ה-XML המפורסמים ביותר. זה מאפשר לך לשנות את התוכן של דף אינטרנט מבלי לטעון אותו מחדש! XSLT מאפשר לך להמיר טקסט XML לפורמטים אחרים. לדוגמה, אתה יכול להשתמש ב-XSLT כדי להמיר XML ל-HTML! כפי שאמרנו, מטרת ה-XML היא לתאר נתונים, לא להציג אותם. אבל עם XSLT נוכל לעקוף את המגבלה הזו! XML DOM מאפשר לך לאחזר, לשנות, להוסיף או למחוק אלמנטים בודדים מקובץ XML. הנה דוגמה קטנה לאיך זה עובד. יש לנו קובץ books.xml:
<bookstore>
   <book category="cooking">
       <title lang="en">Everyday Italian</title>
       <author>Giada De Laurentiis</author>
       <year>2005</year>
       <price>30.00</price>
   </book>
   <book category="children">
       <title lang="en">Harry Potter</title>
       <author>J. K. Rowling</author>
       <year>2005</year>
       <price>29.99</price>
   </book>
</bookstore>
יש בו שני ספרים. לספרים יש אלמנט <title>. כאן נוכל להשתמש ב-JavaScript כדי לקבל את כל כותרות הספרים מקובץ ה-XML שלנו ולהדפיס את הראשון לקונסולה:
<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
  myFunction(this);
  }
};
xhttp.open("GET", "books.xml", true);
xhttp.send();

function myFunction(xml) {
    var xmlDoc = xml.responseXML;
  document.getElementById("demo").innerHTML =
  xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue;
}
</script>

</body>
</html>
DTD ("הגדרת סוג מסמך") מאפשר לך להגדיר רשימה של רכיבים מותרים עבור ישות בקובץ XML. לדוגמה, נניח שאנו עובדים על אתר של חנות ספרים ושכל צוותי הפיתוח מסכימים שיש לציין רק את תכונות הכותרת, המחבר והשנה עבור רכיבי הספר בקובצי ה-XML. אבל איך נגן על עצמנו מפני חוסר זהירות? קל מאוד!
<?xml version="1.0"?>
<!DOCTYPE book [
       <!ELEMENT book (title,author,year)>
       <!ELEMENT title (#PCDATA)>
       <!ELEMENT author (#PCDATA)>
       <!ELEMENT year (#PCDATA)>
       ]>

<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
</book>
כאן הגדרנו רשימה של תכונות חוקיות עבור <book>. נסה להוסיף שם אלמנט חדש ומיד תקבל שגיאה!
<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
   <mainhero>Frodo Baggins</mainhero>
</book>
שְׁגִיאָה! "הרכיב הראשי אסור כאן" ישנם תקני XML רבים אחרים. אתה יכול להכיר כל אחד מהם ולנסות להעמיק בקוד. בכל מקרה, אם אתה צריך מידע על XML, אתה יכול למצוא שם כמעט הכל :) ועם זה, השיעור שלנו מגיע לסיומו. הגיע הזמן לחזור למשימות! :) עד הפעם הבאה!
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION