JavaRush /בלוג Java /Random-HE /XML ב-Java: מה זה?

XML ב-Java: מה זה?

פורסם בקבוצה
שלום! היום נכיר פורמט נתונים נוסף בשם XML. זה נושא חשוב מאוד. כאשר עובדים על יישומי Java אמיתיים, כמעט בוודאות תיתקלו בבעיות הקשורות ל-XML. הפורמט הזה משמש כמעט בכל מקום בפיתוח 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> שלנו יש תכונה "currency".
<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>
כל כך בקלות ובפשטות הוספנו את תיאור האופנועים לקובץ שלנו :) יחד עם זאת, אנחנו ממש לא צריכים להגדיר את אותם תגי ילדים לאופנועים כמו למכוניות. שימו לב שלאופנועים, בניגוד למכוניות, יש אלמנט <בעלים> - הבעלים. זה לא ימנע ממחשב (או מאדם) לקרוא את הנתונים.

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

כבר אמרנו ש-XML ו-HTML מאוד דומים במראה. לכן, חשוב מאוד לדעת במה הם שונים. ראשית, הם משמשים למטרות שונות. HTML - לסימון דפי אינטרנט. לדוגמה, אם אתה צריך ליצור אתר אינטרנט, באמצעות HTML אתה יכול לציין: "התפריט צריך להיות בפינה השמאלית העליונה. צריכים להיות לזה כפתורים כאלה ואחרים". במילים אחרות, המטרה של HTML היא להציג נתונים. XML - לאחסון והעברת מידע בצורה נוחה לבני אדם ולמחשבים. פורמט זה אינו מכיל הוראות כיצד להציג נתונים אלה: זה תלוי בקוד של התוכנית עצמה. שנית, יש להם הבדל טכני עיקרי. תגי HTML מוגדרים מראש. במילים אחרות, כדי ליצור כותרת (לדוגמה, כיתוב גדול בתחילת הדף), משתמשים רק בתגיות <h1></h1> ב-HTML (עבור כותרות קטנות יותר - <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 אבל יש מידע שימושי: קבוצת המפתחים "developersgroup1" ממחלקת "department2" אחראית ליצירת מרחב השמות ה"אמיתי". אם אתה צריך להוסיף שמות חדשים, או לדון איתם בעימותים אפשריים, אנחנו יודעים לאן לפנות. לפעמים כתובת אינטרנט אמיתית עם תיאור של מרחב שמות זה משמשת כשם ייחודי למרחב שמות. למשל, אם מדובר בחברה גדולה והפרויקט שלה ישמש מיליוני אנשים ברחבי העולם. אבל זה לא תמיד נעשה: יש דיון בנושא הזה ב- Stackoverflow . באופן עקרוני, הדרישה להשתמש ב-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 רבים אחרים. תוכלו להכיר כל אחד מהם ולנסות להעמיק בקוד באתר WC3 (סעיף "תקני XML חשובים"). ובכלל, אם אתה צריך מידע על XML, אתה יכול למצוא שם כמעט הכל :) ובכן, ההרצאה שלנו הגיעה לסיומה. הגיע הזמן לחזור למשימות! :) נתראה!
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION