Основы
XML – это так называемый расширяемый язык разметки. Каждое из составных слов этого названия по-своему определяет спецификацию данного языка.
Расширяемый
Это свойство XML позволяет вам вводить свои собственные теги, порядок, в котором они встречаются, и как они должны обрабатываться или отображаться. Еще один способ подумать о расширяемости – учесть, что XML позволяет всем нам расширять наше представление о том, что представляет собой документ: это может быть файл, который живет на файловом сервере, или это может быть временная часть данных, которая течет между двумя компьютерными системами (как в случае с веб-сервисами).
Разметка
Наиболее узнаваемой особенностью XML являются его теги (или элементы, если быть более точным). Фактически, элементы, которые вы создадите в XML, будут очень похожи на элементы, которые вы уже создавали в своих документах HTML. Тем не менее, XML позволяет вам определять свой собственный набор тегов.
Язык
XML – это язык, который имеет множество сходств с HTML. Но при этом более универсальный, потому что позволяет вводить собственные теги. Однако важно понимать, что при этом XML является метаязыком. То есть с его помощью можно создавать или определять другие языки (такие как RSS и MathML – язык математической разметки) и даже такие инструменты, как XSLT.
Назначение XML и отличия от HTML
Хорошо, теперь мы знаем, что это такое, но зачем нам XML? Нам он нужен потому, что HTML специально разработан для описания документов, отображаемых в веб-браузере, и не более того. Он становится слишком громоздким, если вы хотите отобразить документы на мобильном устройстве или сделать что-нибудь хоть немного сложнее (например, перевод контента с немецкого на английский). Единственная цель HTML – позволить любому человеку быстро создавать веб-документы, которыми можно делиться с другими людьми. XML, с другой стороны, подходит не только для интернета – он может использоваться в различных контекстах, некоторые из которых могут не иметь ничего общего с людьми, взаимодействующими с контентом (например, веб-службы используют XML для отправки запросов и ответов).
HTML редко (если вообще когда-либо) предоставляет информацию о том, как структурирован документ или что он означает. То есть XML описывает данные, а HTML их представляет.
Структура
Давайте теперь рассмотрим XML со структурной точки зрения. Простейшие элементы XML содержат открывающий тег, закрывающий тег и какой-нибудь контент. Открывающий тег начинается с левой угловой скобки (<), за которой следует имя элемента, содержащего буквы и цифры (но без пробелов), и заканчивается правой угловой скобкой (>). В XML контент обычно анализируется символьными данными. Он может состоять из простого текста, других элементов XML и более экзотических вещей, таких как сущности XML, комментарии и инструкции по обработке. За содержимым следует закрывающий тег, который содержит те же слова и заглавные буквы, что и открывающий тег, но с одним небольшим изменением: / появляется прямо перед именем элемента.
Вот несколько примеров допустимых элементов XML:
Элементы, теги или узлы?
Все три эти термина на первый взгляд могут быть взаимозаменяемыми, но каждый из них имеет очень точное значение:
- Элемент состоит из открывающего тега, его атрибутов, любого содержимого и закрывающего тега;
- Тег – открывающий или закрывающий – используется для обозначения начала или конца элемента;
- Узел является частью иерархической структуры, которая составляет документ XML. «Узел» – это общий термин, который применяется к любому типу объекта документа XML, включая элементы, атрибуты, комментарии, инструкции по обработке и простой текст.
Если вы привыкли работать с HTML, вы, вероятно, создали много документов, в которых отсутствуют конечные теги, используются разные заглавные буквы при открытии и закрытии тегов и содержатся неправильно вложенные теги.
Вы не сможете избавиться от всего этого в XML! На этом языке тег <myElement> отличается от тега <MYELEMENT>, и оба они отличаются от тега <myELEMENT>. Если ваш начальный тег <myELEMENT>, а закрывающий тег </Myelement>, ваш документ просто-напросто не будет работать.
Если вы используете атрибуты для каких-либо элементов, значения атрибутов должны быть заключены в одинарные или двойные кавычки. Вы больше не можете обойтись с голыми значениями атрибутов, как в HTML! Давайте ознакомимся с этим на примере. Следующее абсолютно нормально в HTML:
<h1 class=topHeader>
В XML вы должны поместить кавычки (одинарные или двойные) вокруг значения атрибута, например:
<h1 class="topHeader">
Кроме того, если вы неправильно вложите свои элементы (то есть закроете элемент перед закрытием другого элемента внутри него), ваш документ не будет действительным. Например, веб-браузеры обычно не жалуются на следующее:
<b>Some text that is bolded, some that is <i>italicized</b></i>.
В XML это неправильное вложение элементов вызовет ошибку при чтении документа программой.
Атрибуты
Вы можете думать об атрибутах как о прилагательных – они предоставляют дополнительную информацию об элементе, которая может не иметь никакого смысла как содержание. Если вы работали с HTML, вы знакомы с такими атрибутами, как src (источник файла) в теге <img>.
Какая информация должна содержаться в атрибуте? Что должно появляться между тегами элемента? Это предмет многих споров, но не волнуйтесь, здесь действительно нет неправильных ответов. Помните: вы сами определяете свой язык. Некоторые разработчики обожают применять это правило: используйте атрибуты для хранения данных, которые не обязательно должны отображаться пользователю информации. Другим распространенным эмпирическим правилом является рассмотрение длины данных. Потенциально большие данные должны быть размещены внутри тега; более короткие данные могут быть помещены в атрибут. Обычно атрибуты используются для «украшения» данных, содержащихся в теге.
Давайте рассмотрим этот вопрос немного более внимательно. Допустим, вы хотели создать XML-документ для отслеживания вашей коллекции DVD. Вот небольшой фрагмент кода, который вы смогли бы использовать:
Маловероятно, что кому-либо, кто читает этот документ, понадобится знать идентификатор любого из DVD-дисков в вашей коллекции. Таким образом, мы могли бы безопасно хранить идентификатор как атрибут элемента <dvd>, например так:
<dvd id="1">
В других частях нашего списка DVD, информация кажется немного голой. Например, мы показываем имя актера только между тегами <actor>, хотя могли бы включить здесь гораздо больше информации. Один из способов сделать это – добавить атрибуты:
<actor type="superstar" gender="male" age="50">Harrison Ford
</actor>
Однако в этом случае мы, вероятно, вернемся к нашему эмпирическому правилу – большинство пользователей, вероятно, захотят узнать хотя бы часть этой информации. Итак, давайте преобразуем некоторые из этих атрибутов в элементы:
<actor type="superstar">
<name>Harrison Ford</name>
<gender>male</gender>
<age>50</age>
</actor>
Остерегайтесь избыточных данных
С другой стороны, можно смело утверждать, что у вас не должно быть всей этой повторяющейся информации в вашем XML-файле. Например, ваша коллекция должна включать как минимум еще один фильм с участием Харрисона Форда. С архитектурной точки зрения было бы разумнее иметь отдельный список актеров с уникальными идентификаторами, на которые вы могли бы ссылаться.
Сущности
Сущность – это удобная конструкция, которая в простейшем случае позволяет вам определять специальные символы для вставки в ваши документы. Если вы работали с HTML, вы знаете, что сущность < вставляет символ "<" в документ. Вы не можете использовать реальный символ, потому что он будет рассматриваться как начало тега, поэтому вы заменяете его соответствующим объектом.
XML, верный своей расширяемой природе, позволяет создавать свои собственные объекты. Предположим, что уведомление об авторских правах вашей компании должно присутствовать в каждом отдельном документе. Вместо того, чтобы вводить это уведомление снова и снова, вы можете создать ссылку на сущность с именем copyright_notice с соответствующим текстом, а затем использовать ее в своих документах XML как ©right_notice;. Это экономит огромное количество времени!
Больше, чем просто структура
XML-документы – это не просто последовательность элементов. Если вы еще раз более внимательно взглянете на наш пример с коллекцией DVD, вы заметите две вещи:
- Документы самоописываются, как мы уже обсуждали;
- Документы действительно представляют собой иерархию вложенных объектов.
Давайте очень быстро рассмотрим первый пункт. Мы уже говорили, что большинство (если не все) XML-документы имеют самоописание. Эта функция в сочетании со всем содержимым переносит все документы XML далеко за пределы простых данных и попадает в почитаемые залы информации.
Данные могут содержать строку символов или цифр, например 5551238888. Эта строка может представлять что угодно, от серийного номера ноутбука, идентификатора рецепта аптеки до номера телефона в Соединенных Штатах. Но единственный способ превратить эти данные в информацию (и, следовательно, сделать ее полезной) – это добавить к ней контекст. Если у вас есть контекст, вы можете быть уверены в том, что представляют данные. Короче говоря, <phone country="us"> 5551238888</phone> не оставляет никаких сомнений в том, что эта, казалось бы, произвольная цепочка цифр на самом деле является номером телефона США.
Поскольку мы потратили время на создание XML-документов, наша информация больше не заперта в проприетарных форматах, таких как текстовые процессоры или электронные таблицы. Более того, ее больше не нужно «переделывать» каждый раз, когда вы хотите создать альтернативное отображение этой информации: все, что вам нужно сделать, – это создать таблицу стилей или преобразование, чтобы сделать ваш XML представимым на заданном носителе.
Если принять во внимание второй момент, согласно которому документ XML действительно представляет собой иерархию объектов, – открывается большое разнообразие возможностей. Помните, что мы обсуждали ранее – что в XML-документе один элемент содержит все остальные? Хорошо, этот корневой элемент становится корнем нашего иерархического дерева. Вы можете думать об этом дереве как о генеалогическом дереве, у корневого элемента которого есть различные дочерние элементы (в данном случае – элементы продукта), а у каждого из них –различные дочерние элементы (имя, описание и т. д.). В свою очередь, у каждого элемента продукта есть различные одноуровневые элементы (другие элементы продукта) и родительский элемент (корень).
Поскольку у нас есть такое дерево, мы должны быть в состоянии перемещаться по нему вверх и вниз, а также из стороны в сторону, относительно легко. С программной точки зрения, большая часть вашей работы с XML будет сосредоточена на правильном создании и навигации по структурам XML.