XML למתחילים מוחלטים

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

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

החדשות הטובות הן שרבים ממגבלות ה- HTML התגברו ב- XML, שפת הסימון הרחבה. ניתן להבין את ה- XML ​​בקלות לכל מי שמבין HTML, אך הוא הרבה יותר חזק. יותר מאשר רק שפת סימון, XML הוא שפה מתכתית - שפה המשמשת להגדרת שפות סימון חדשות. באמצעות XML, תוכל ליצור שפה המיוצרת במיוחד עבור היישום או הדומיין שלך.

XML ישלים, ולא יחליף, HTML. בעוד ש- HTML משמש לעיצוב והצגת נתונים, XML מייצג את המשמעות ההקשרית של הנתונים.

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

האם XML בשבילך?

למרות שמאמר זה נכתב לכל מי שמתעניין ב- XML, יש לו קשר מיוחד לסדרת JavaWorld ב- XML ​​JavaBeans. (ראה משאבים לקישורים למאמרים קשורים.) אם קראת את הסדרה ההיא ולא ממש "משיג אותה", מאמר זה אמור להבהיר כיצד להשתמש ב- XML ​​עם שעועית. אם הם מקבלים את זה, במאמר זה משמש חתיכת לוויה מושלמת הסדרה JavaBeans XML, שכן הוא מכסה נושאים נגעה בהם. ואם אתה אחד מבני המזל שעדיין מחזיקים במאמרי ה- XML ​​JavaBeans, אני ממליץ לך לקרוא תחילה את המאמר הנוכחי כחומר היכרות.

הערה על Java

בעולם המחשבים יש כל כך הרבה פעילות XML עד כה, שאפילו מאמר באורך זה יכול רק לרפרף על פני השטח. ובכל זאת, כל העניין של מאמר זה הוא לתת לך את ההקשר הדרוש לך כדי להשתמש ב- XML ​​בעיצוב תוכניות Java שלך. מאמר זה מכסה גם כיצד XML פועל עם טכנולוגיית האינטרנט הקיימת, מכיוון שמתכנתי Java רבים עובדים בסביבה כזו.

XML פותח את תכנות האינטרנט וה- Java לפונקציונליות ניידת שאינה דפדפן. XML משחרר תוכן אינטרנט מהדפדפן באותו אופן שבו ג'אווה משחררת את התנהגות התוכנית מהפלטפורמה. XML הופך תוכן אינטרנט לזמין ליישומים אמיתיים.

Java היא פלטפורמה מצוינת לשימוש ב- XML, ו- XML ​​היא ייצוג נתונים יוצא מן הכלל ליישומי Java. אציין כמה מהעוצמות של Java עם XML ככל שנלך.

נתחיל בשיעור היסטוריה.

המקורות של שפות הסימון

ה- HTML שכולנו מכירים ואוהבים (ובכן, שאנחנו מכירים, בכל מקרה) תוכנן במקור על ידי טים ברנרס-לי ב- CERN ( le Conseil Européen pour la Recherche Nucléaire, או המעבדה האירופית לפיזיקת חלקיקים) בז'נבה כדי לאפשר חנונים לפיזיקה ( ואפילו לא חנונים) לתקשר אחד עם השני. HTML שוחרר בדצמבר 1990 במסגרת CERN, והיה זמין לציבור בקיץ 1991 עבור כולנו. CERN וברנרס-לי מסרו את המפרט ל- HTML, HTTP ו- URL, במסורת הישנה והמשובחת של שיתוף והנאה באינטרנט.

ברנרס-לי הגדיר HTML ב- SGML, שפת הסימון הכללית הרגילה. SGML, כמו XML, הוא שפה מתכתית - שפה המשמשת להגדרת שפות אחרות. כל שפה מוגדרת כל כך נקראת יישום של SGML. HTML הוא יישום של SGML.

SGML עלה ממחקר שנעשה בעיקר ב- IBM בנושא ייצוג מסמכי טקסט בסוף שנות ה -60. יבמ יצרה את GML ("שפת הסימון הכללית"), שפת קודמת ל- SGML, ובשנת 1978 מכון התקנים הלאומי האמריקני (ANSI) יצר את הגרסה הראשונה שלה ל- SGML. התקן הראשון שוחרר בשנת 1983, עם טיוטת התקן שפורסמה בשנת 1985, והתקן הראשון פורסם בשנת 1986. מעניין לציין כי תקן ה- SGML הראשון פורסם באמצעות מערכת SGML שפותחה על ידי אנדרס ברגלונד ב- CERN, הארגון שכאשר ראינו, נתנו לנו HTML ואת האינטרנט.

SGML נמצא בשימוש נרחב בתעשיות וממשלות גדולות כגון בחברות תעופה וחלל, רכב וטלקומוניקציה גדולות. SGML משמש כסטנדרט מסמכים במשרד ההגנה של ארצות הברית ובשירות ההכנסה הפנימית. (עבור קוראים מחוץ לארה"ב, מס הכנסה הוא חבר המס.)

אלברט איינשטיין אמר שהכל צריך להיות פשוט ככל האפשר, ולא פשוט יותר. הסיבה ש- SGML לא נמצא במקומות רבים יותר היא שהיא מתוחכמת ומורכבת ביותר. ו- HTML, שאפשר למצוא בכל מקום, הוא פשוט מאוד; עבור הרבה יישומים, זה פשוט מדי.

HTML: כל הצורה וללא חומר

HTML היא שפה שנועדה "לדבר על" מסמכים: כותרות, כותרות, כיתובים, גופנים וכו '. זה מכוון מאוד למבנה ולמסמך.

אמנם, אמנים והאקרים הצליחו לחולל ניסים בעזרת הכלי המשעמם יחסית שנקרא HTML. אך ל- HTML יש חסרונות חמורים ההופכים אותו לכושר לקוי לתכנון מערכות מידע גמישות, עוצמתיות, אבולוציוניות. הנה כמה מהתלונות העיקריות:

  • HTML אינו ניתן להרחבה

    שפת סימון הניתנת להרחבה תאפשר למפתחי יישומים להגדיר תגים מותאמים אישית עבור מצבים ספציפיים ליישום. אלא אם כן אתה גורילה במשקל של 600 קילו (ואולי גם לא אז) אינך יכול לדרוש מכל יצרני הדפדפנים ליישם את כל תגי הסימון הדרושים ליישום שלך. אז אתה תקוע עם מה שיצרני הדפדפנים הגדולים, או ה- W3C (Consortium World Wide Web) יאפשרו לך לקבל. מה שאנחנו צריכים זו שפה שמאפשרת לנו להרכיב תגי סימון משלנו מבלי להתקשר ליצרן הדפדפן.

  • HTML הוא מאוד ממוקד תצוגה

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

  • בדרך כלל לא ניתן להשתמש ישירות ב- HTML

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

  • HTML מספק רק 'תצוגה' אחת של נתונים

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

  • ל- HTML מבנה סמנטי מועט או כמעט לא

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

    אָדוֹם

    לתוך מנוע חיפוש, ותקבל קישורים לסקלטון האדום, הרינג אדום, סנאפר אדום, הפחד האדום, יום האותיות האדומות, וכנראה דף או שניים של "ספרים שהייתי אדום". ל- HTML אין דרך לציין מה המשמעות של פריט דף מסוים. שפת סימון שימושית יותר תייצג מידע מבחינת משמעותו. מה שאנחנו צריכים זו שפה שאומרת לנו לא איך

    לְהַצִיג

    מידע, אלא, איזה גוש מידע נתון

    הוא

    כדי שנדע מה לעשות עם זה.

SGML has none of these weaknesses, but in order to be general, it's hair-tearingly complex (at least in its complete form). The language used to format SGML (its "style language"), called DSSSL (Document Style Semantics and Specification Language), is extremely powerful but difficult to use. How do we get a language that's roughly as easy to use as HTML but has most of the power of SGML?

Origins of XML

As the Web exploded in popularity and people all over the world began learning about HTML, they fairly quickly started running into the limitations outlined above. Heavy-metal SGML wonks, who had been working with SGML for years in relative obscurity, suddenly found that everyday people had some understanding of the concept of markup (that is, HTML). SGML experts began to consider the possibility of using SGML on the Web directly, instead of using just one application of it (again, HTML). At the same time, they knew that SGML, while powerful, was simply too complex for most people to use.

In the summer of 1996, Jon Bosak (currently online information technology architect at Sun Microsystems) convinced the W3C to let him form a committee on using SGML on the Web. He created a high-powered team of muckety-mucks from the SGML world. By November of that year, these folks had created the beginnings of a simplified form of SGML that incorporated tried-and-true features of SGML but with reduced complexity. This was, and is, XML.

In March 1997, Bosak released his landmark paper, "XML, Java and the Future of the Web" (see Resources). Now, two years later (a very long time in the life of the Web), Bosak's short paper is still a good, if dated, introduction to why using XML is such an excellent idea.

SGML was created for general document structuring, and HTML was created as an application of SGML for Web documents. XML is a simplification of SGML for general Web use.

An XML conceptual example

All this talk of "inventing your own tags" is pretty foggy: What kind of tags would a developer want to invent and how would the resulting XML be used? In this section, we'll go over an example that compares and contrasts information representation in HTML and XML. In a later section ("XSL: I like your style") we'll go over XML display.

First, we'll take an example of a recipe, and display it as one possible HTML document. Then, we'll redo the example in XML and discuss what that buys us.

HTML example

Take a look at the little chunk of HTML in Listing 1:

   Lime Jello Marshmallow Cottage Cheese Surprise   

Lime Jello Marshmallow Cottage Cheese Surprise

My grandma's favorite (may she rest in peace).

Ingredients

Qty Units Item
1 box lime gelatin
500 g multicolored tiny marshmallows
500 ml cottage cheese
dash Tabasco sauce (optional)

Instructions

  1. Prepare lime gelatin according to package instructions...

Listing 1. Some HTML

(A printable version of this listing can be found at example.html.)

Looking at the HTML code in Listing 1, it's probably clear to just about anyone that this is a recipe for something (something awful, but a recipe nonetheless). In a browser, our HTML produces something like this:

Lime Jello Marshmallow Cottage Cheese Surprise

My grandma's favorite (may she rest in peace).

Ingredients

Qty Units Item
1 box lime gelatin
500 g multicolored tiny marshmallows
500 ml Cottage cheese
  dash Tabasco sauce (optional)

Instructions

  1. Prepare lime gelatin according to package instructions...

Listing 2. What the HTML in Listing 1 looks like in a browser

Now, there are a number of advantages to representing this recipe in HTML, as follows:

  • It's fairly readable. The markup may be a little cryptic, but if it's laid out properly it's pretty easy to follow.

  • The HTML can be displayed by just about any HTML browser, even one without graphics capability. That's an important point: The display is browser-independent. If there were a photo of the results of making this recipe (and one certainly hopes there isn't), it would show up in a graphical browser but not in a text browser.

  • You could use a cascading style sheet (CSS -- we'll talk a bit about those below) for general control over formatting.

There's one major problem with HTML as a data format, however. The meaning of the various pieces of data in the document is lost. It's really hard to take general HTML and figure out what the data in the HTML mean. The fact that there's an of this recipe with a (quantity) of 500 ml () of cottage cheese would be very hard to extract from this document in a way that's generally meaningful.

Now, the idea of data in an HTML document meaning something may be a bit hard to grasp. Web pages are fine for the human reader, but if a program is going to process a document, it requires unambiguous definitions of what the tags mean. For instance, the tag in an HTML document encloses the title of the document. That's what the tag means, and it doesn't mean anything else. Similarly, an HTML tag means "table row," but that's of little use if your program is trying to read recipes in order to, say, create a shopping list. How could a program find a list of ingredients from a Web page formatted in HTML?

Sure, you could write a program that grabs the headers out of the document, reads the table column headers, figures out the quantities and units of each ingredient, and so on. The problem is, everyone formats recipes differently. What if you're trying to get this information from, say, the Julia Childs Web site, and she keeps messing around with the formatting? If Julia changes the order of the columns or stops using tables, she'll break your program! (Though it has to be said: If Julia starts publishing recipes like this, she may want to think about changing careers.)

Now, imagine that this recipe page came from data in a database and you'd like to be able to ship this data around. Maybe you'd like to add it to your huge recipe database at home, where you can search and use it however you like. Unfortunately, your input is HTML, so you'll need a program that can read this HTML, figure out what all the "Ingredients," "Instructions," "Units," and so forth are, and then import them to your database. That's a lot of work. Especially since all of that semantic information -- again, the meaning of the data -- existed in that original database but were obscured in the process of being transformed into HTML.

Now, imagine you could invent your own custom language for describing recipes. Instead of describing how the recipe was to be displayed, you'd describe the information structure in the recipe: how each piece of information would relate to the other pieces.

XML example

Let's just make up a markup language for describing recipes, and rewrite our recipe in that language, as in Listing 3.

  Lime Jello Marshmallow Cottage Cheese Surprise  My grandma's favorite (may she rest in peace).    1 lime gelatin   500 multicolored tiny marshmallows   500 Cottage cheese    Tabasco sauce     Prepare lime gelatin according to package instructions     

Listing 3. A custom markup language for recipes

It will come as little surprise to you, being the astute reader you are, that this recipe in its new format is actually an XML document. Maybe the fact that the file started with the odd header


  

gave it away; in fact, every XML file should begin with this header. We've simply invented markup tags that have a particular meaning; for example, "An is a (quantity in specified units) of a single , which is possibly optional." Our XML document describes the information in the recipe in terms of recipes, instead of in terms of how to display the recipe (as in HTML). The semantics, or meaning of the information, is maintained in XML because that's what the tag set was designed to do.

Notes on notation

It's important to get some nomenclature straight. In Figure 1, you see a start tag, which begins an enclosed area of text, known as an Item, according to the tag name. As in HTML, XML tags may include a list of attributes (consisting of an attribute name and an attribute value.) The Item defined by the tag ends with the end tag.

Not every tag encloses text. In HTML, the

tag means "line break" and contains no text. In XML, such elements aren't allowed. Instead, XML has empty tags, denoted by a slash before the final right-angle bracket in the tag. Figure 2 shows an empty tag from our XML recipe. Note that empty tags may have attributes. This empty tag example is standard XML shorthand for .

In addition to these notational differences from HTML, the structural rules of XML are more strict. Every XML document must be well-formed. What does that mean? Read on!

Ooh-la-la! Well-formed XML

The concept of well-formedness comes from mathematics: It's possible to write mathematical expressions that don't mean anything. For example, the expression

2 ( + + 5 (=) 9 > 7

looks (sort of) like math, but it isn't math because it doesn't follow the notational and structural rules for a mathematical expression (not on this planet, at least). In other words, the "expression" above isn't well-formed. Mathematical expressions must be well-formed before you can do anything useful with them, because expressions that aren't well-formed are meaningless.

A well-formed XML document is simply one that follows all of the notational and structural rules for XML. Programs that intend to process XML should reject any input XML that doesn't follow the rules for being well-formed. The most important of these rules are as follows: