Язык XML

Мой блог
Язык XML

Я предлагаю вам сразу определить аббревиатуру. «XML» — это сокращение от Extensible Markup Language, поэтому мы можем предположить, что это потомок HTML. Законный вопрос: что не устраивало создателей HTML и что послужило толчком для создания нового языка? Вспомните цель HTML: визуальное представление данных. XML был создан для структурирования данных, для чего не предназначался его предок. HTML имеет дело с отображением и внешним видом, а XML занимается описанием и структурой. По этой причине XML не заменяет HTML. У этих двух языков очень разные цели, хотя код похож по внешнему виду.

С практической точки зрения, XML можно кратко определить как кроссплатформенный, независимый от программного и аппаратного обеспечения носитель информации.

Как его предок, новый язык («новый» по сравнению с HTML, потому что XML был разработан три года назад) имеет теги, называемые узлами. Единственное отличие состоит в том, что HTML имеет четко определенные теги ( lt; a gt;, lt; p gt;, lt; h1 gt; и т. Д.), Новые теги появляются только по желанию стандартов и разработчики браузеров. XML — это совсем другая история: количество предопределенных (служебных) тегов сведено к минимуму, и разработчик может использовать свои собственные теги и структуру документа для хранения данных.

Давайте рассмотрим простой пример. У нас есть стопка книг, которую нам нужно систематизировать (то есть организовать). Что нам нужно, чтобы охарактеризовать книгу? Автор, название, год публикации. Наш XML-документ будет выглядеть так:

lt ;? Xml version = 1.0 encoding = windows-1251 ? gt;
lt; library gt;
lt; book gt;
lt; author gt; A. Конан Дойл lt; / author gt;
lt; title lt; Шерлок Холмс lt; / title gt;
lt; год gt; 1996 lt; / year gt; br lt; / book gt;

lt; book gt;
lt; author gt; L. Толстой lt; / author gt;
lt; title lt; Анна Каренина lt; / title gt;
lt; год gt; 2001 lt; / year gt;
lt; / book gt;
lt; / library gt;

Обратите внимание, что в этом примере не упоминается, как должна отображаться информация (какой цвет, шрифт, шрифт размер и т. д.) отображается только структура документа. ), мы показываем только структуру документа: у нас есть библиотека ( lt; library gt;), которая содержит книги ( lt; book gt;), описанные автором ( lt; author gt;), заголовок ( lt; title gt;) и год публикации ( lt; year gt;).

В классическом HTML информация хранится внутри файла .html. Когда мы хотим что-то изменить, мы должны одновременно манипулировать и данными, и правилами отображения, что довольно неудобно. XML решает эту проблему: мы можем хранить данные в одном файле (XML) и отображать правила в другом (HTML). Но XML позволяет хранить данные внутри файлов HTML, в островках данных. Однако информация по-прежнему структурирована и отделена от правил визуального представления.

XML позволяет несовместимым системам обмениваться информацией. В настоящее время существует множество стандартов хранения информации в разных операционных системах и базах данных, что делает невозможным обмен информацией между системами. XML успешно решает эту проблему.

Кроме того, XML хранится в общих текстовых файлах, что позволяет разработчикам разных языков программирования и операционных систем создавать разные приложения, основанные на одном и том же стандарте, доступном для всех. / p

Однако не предполагайте, что XML делает все. Он позволяет хранить только данные, а языки программирования поддерживают эти данные.

Вернемся к нашему примеру. Прежде чем приступить к созданию XML-документа, вам необходимо понять, как создавать хорошо отформатированные XML-документы.

Каждый документ должен указывать, какой тип данных он содержит. Чтобы обработчик (в данном случае парсер документа — Internet Explorer 5+) правильно проанализировал XML-документ, первая строка указывает, что документ является XML 1.0 и закодирован с помощью windows-1251. Следующая строка — это предметroot, который является обязательным элементом, который сообщает разработчику, что содержит документ (в нашем случае lt; library gt; сообщает нам, что мы имеем дело с библиотекой).

Не все элементы HTML требуют синтаксис закрывающего тега ( lt; br gt;, lt; hr gt; и т. д.)

XML, с другой стороны, требует обязательных закрывающих тегов. Хотя есть исключения: первая строка нашего примера не имеет закрывающего тега. Это связано с тем, что строка является не частью документа и информации, а скорее заголовком.

Теги XML чувствительны к регистру. Это означает, что lt; author gt; i lt; Автор gt; это два разных тега; соответственно, оба требуют идентичных закрывающих тегов, что и открывающие теги, в противном случае они потерпят неудачу.

Поскольку XML предназначен для структурирования данных, это естественное условие, что теги явно встроены. В то время как в HTML вы можете написать lt; b gt; lt; i gt; Текст lt; / b gt; lt; / i gt;, XML требует явного вложения: lt; b gt; lt; i gt; Текст lt; / i gt; lt; / b gt; в противном случае — ошибка.

Как уже упоминалось, XML-документ должен содержать корневой элемент (тег), в нашем случае это ​​lt; library gt ;.

Как и в HTML , в XML теги могут иметь атрибуты. Единственное отличие состоит в том, что значения атрибутов всегда следует заключать в кавычки ( lt; book language = rus gt;, а не lt; book language = rus gt;), иначе вы получите сообщение об ошибке. / p

Полным преимуществом и недостатком HTML была его способность игнорировать двойные пробелы: если вы скажете «Это мой текст», это будет считаться «Это мой текст» в HTML. В XML не игнорируются двойные пробелы.

Но когда дело доходит до комментариев кода, XML ничем не отличается от своего предка ( lt ;! Комментарий gt;).

Бывают случаи, когда нам нужно сохранить определенную информацию (например, программный код), которая содержит значительное количество специальных символов ( lt;, gt;, ‘,’). Конечно, вы можете заменить эти символы управляющими последовательностями ( lt;, gt;, ), но это неудобно, если вам нужно сохранять целые функции. В XML вы можете включить необходимые данные в конструкцию lt ;! [CDATA […]] gt ;. Информация, хранящаяся в этом разделе, не обрабатывается интерпретатором, поэтому ошибок не возникает:

lt; script gt;
lt;! [CDATA [
функция doThis (a, b) {
if (a lt; b a lt; 0) { return 1
}
else { br return 0
}
}
] gt;
lt; / script gt;

Обращает на себя внимание тот факт, что XML-документы могут быть включены, и это не имеет воздействуют на программу, которая их обрабатывает. Если мы добавим автора и заголовок в XML-документ, а также добавим к книге другой атрибут (например, количество страниц — lt; pages gt; lt; / pages gt;), программа не пострадает, потому что книга атрибут по-прежнему будет содержать нужные нам теги — lt; author gt; i lt; title gt;.

В HTML мы имели небольшое представление о взаимосвязи между тегами — например, lt; title gt; должен содержаться в теге lt; head gt ;. Поскольку XML имеет четко определенную структуру, отношения также определяются и характеризуются родительскими и дочерними элементами. В нашем примере тег lt; book gt; является дочерним элементом lt; library gt; и родительский элемент тегов lt; author gt;, lt; title gt;, lt; year gt;.

Как и в HTML, XML имеет понятие содержимого тега только в более по-другому. В HTML мы можем ссылаться на тег lt; a href = http://www.site.com gt; My lt; / a gt;, который имеет атрибут href значения http: // www.site.com и содержимое тега My lt; / a gt;. В XML есть четыре типа содержимого: элемент (этот элемент (тег) содержит другие элементы (теги)), смешанный (теги и текст), простой (текст) и пустой (тег имеет только атрибуты и не содержит содержимого — lt ; a href = http://www.site.com gt; lt; / a gt;). Если мы имеем дело с тегами, у которых нет содержимого, мы рекомендуем заключать эти теги непосредственно в открывающий тег для оптимизации.код ( lt; book language = rus / gt; вместо lt; book language = rus gt; lt; / book gt;).

Хотя XML позволяет разработчику определять теги самостоятельно, существуют простые правила в отношении имен тегов:

Имена тегов могут содержать буквы, числа и символы, кроме пробелов;

Имя не может начинаться с цифры или знака препинания;

Имя не может начинаться со слова XML.

Следует также избегать использования символа -, поскольку в некоторых случаях он вызывает ошибку в программе обработки XML-документов.

XML позволяет использовать нелатинские символы в теги, но я не рекомендую использовать эту функцию.

В первые дни XML вы могли задаться вопросом, зачем использовать вложенные теги, когда у вас есть атрибуты? Например, мы могли бы написать нашу библиотеку так:

lt ;? Xml version = 1.0

encoding = windows-1251? gt;
lt; library gt;
lt; book author = А. Конан Дойл title = Шерлок Холмс год = 1996 г. / gt;
lt; / library gt;

Да, это сокращает код, но нам нужно помнить, почему мы это сделали, а затем систематизировать информацию. Эта нотация не дает четкого представления о структуре данных, не позволяет хранить более одного значения в атрибуте (в отличие от дочерних элементов), имеет худшую расширяемость.

Но вам не следует этого делать. доходят до крайностей и с дочерними элементами. Вам следует переосмыслить структуру и с умом использовать как атрибуты, так и дочерние элементы.

Так мы создали наш первый XML-документ (файл с расширением .xml). Как ты это видишь? Есть ли в нем ошибки? Просто: вам нужен IE 5+ и дважды щелкните XML-файл. Если документ сгенерирован правильно, он будет отображаться в браузере, вы сможете увидеть код с подсветкой синтаксиса и развернуть / свернуть дочерние элементы. Если в вашем коде есть ошибки, вы получите сообщение об ошибке вместо документа.

Прежде чем мы начнем обсуждать, как управлять XML-документом, давайте определим его структуру. Вот окончательный вид нашего файла:

lt ;? Xml version = 1.0 encoding = windows-1251 quot ;? gt;
lt; library gt;
lt; book pages = 843 gt;
lt; author gt; А. Конан Дойл lt; / author gt;
lt; title lt; Шерлок Холмс lt; / title gt;
lt; год gt; 1996 lt; / year gt; br lt; / book gt;

lt; book pages = 457 gt;
lt; author gt; L. Толстой lt; / author gt;
lt; title lt; Анна Каренина lt; / title gt;
lt; год gt; 2001 lt; / year gt;
lt; / book gt;
lt; / library gt;

Мы будем использовать внешний XML-файл для примеров, но есть несколько островков данных, о которых стоит упомянуть . Островки данных позволяют хранить данные XML непосредственно в документе HTML. Для этого XML-структура должна быть заключена в теги lt; xml id = library gt; lt; / xml gt ;, где атрибут id используется для идентификации острова. и использовать его содержимое. «Острова» также можно загружать из внешних файлов: lt; xml id = library src=library.xml gt; lt; / xml gt;. Интересным решением при управлении данными XML является возможность подключения к правилам отображения HTML. В следующем примере показано, как могут быть представлены данные нашей библиотеки:

lt; html gt;
lt; body gt;
lt; xml id = библиотека src= библиотека. xml gt; lt; / xml gt;

lt; table border = 1 ; datasrc=# библиотека gt;
lt; tr gt;
lt; td gt; lt; span datafld = автор gt; lt; / span gt; lt; / td gt;
lt; td gt; lt; span datafld = title quot; gt; lt; / span gt; lt; / td gt;
lt; td gt; lt; td gt; lt; span datafld = год gt; lt; lt; / span gt; lt; / td gt;
lt; / tr gt;
lt; / table gt;

lt; / body gt;
tl; / html gt;

Есть несколько способов справиться с XML-данные для Интернета. Это CSS, XSL и JavaScript. Давайте проанализируем их по порядку.

Возможность использования CSS для управления XML-документами очевидна: каскадированиеТаблицы стилей позволяют указать стиль, в котором отображаются данные, но не управляют содержимым документа. Хотя эта комбинация непродуктивна, если вы хотите ее использовать, во второй строке XML-документа напишите lt ;? Xml-stylesheet type = text / css href = main.css ? gt;. Структура файла .css проста: имена стилей должны совпадать с именами тегов, для которых эти стили предназначены. Почему это непродуктивно? Потому что XML обогащен собственной аналогичной технологией XSL или Extensible Stylesheet Language. Как следует из названия, это также таблица стилей, хотя и с большим количеством опций, чем CSS. Однако это не идеальное решение. Чтобы использовать XSL, вторая строка кода должна включать lt ;? Xml-stylesheet type = text / xsl href = main.xsl quot ;? gt;.

Теперь давайте поговорим о JavaScript, который, на мой взгляд, хотя и не идеален с точки зрения скорости, но является лучшим способом визуализации данных XML. в браузерах.

Как мы можем использовать XML и как XML может нам помочь? Это повсеместное приложение, которое помогает нам не только структурировать контент, но также экономить полосу пропускания и оптимизировать размеры документов. Предположим, вы хотите создать меню для веб-сайта. XML-документ будет выглядеть так:

lt ;? Xml version = 1.0 encoding = windows-1251 ? gt;
lt; меню

onmouseover = mouseOver1 () gt;
lt; unit gt;
lt; title gt; О нас lt; / title gt;
lt; style gt; menu1 lt; / style gt;
lt; link gt; o. html lt; / link gt;
lt; / unit gt;

lt; unit gt;
lt; title gt; контакты lt; / title gt;
lt; style gt; menu1 lt; / style gt;
lt; link gt; контакты. html lt; / link gt;
lt; / unit gt;

lt; unit onmouseover = mouseOver2 () gt;
lt; title gt ; партнеры lt; / title gt;
lt; style gt; menu2 lt; / style gt;
lt; link gt; partners. html lt; / link gt;
lt; / unit gt;
lt; / menu gt;

Помните, что примеры в этой статье не t идеально — у вас может быть структура получше, но эта будет для нас примером. Что теги lt; title gt; я lt; ссылка gt; наверное понятно — я просто скажу, что тег lt; style gt; сообщает нам, какой стиль CSS использовался для входа в меню (конечно, мы должны создать эти стили в файле .css).

Корневой тег содержит атрибут onmouseover со значением mouseOver1 (). Этот атрибут сообщает, какая функция JavaScript будет вызываться при наведении курсора мыши на пункт меню. Однако последний пункт меню имеет собственный атрибут onmouseover с другим значением. Это сделано для того, чтобы вы могли, например, назначать разные обработчики событий для разных пунктов меню (стиль CSS этого пункта меню также отличается от двух предыдущих). Итак, по мере того, как мы формируем меню, мы устанавливаем параметры для наших элементов. В первых двух элементах мы не найдем никакого обработчика событий (onmouseover), что означает, что нам придется искать его на более высоком уровне, поскольку он кажется общим для этих элементов. Это сделано для экономии кода и трафика. Однако, поскольку третий элемент отличается (мы этого хотим), обработчик для него будет другим — мы ясно дали понять.

Хорошо, давайте попробуем загрузить XML-документ в нашу программу JavaScript, сгенерировать меню и отобразить его пользователю. Я предлагаю использовать слой ( lt; div gt;) для вставки меню. Предлагаю вам взглянуть на приведенный ниже код и обсудить его построчно:

lt; html gt;
lt; title gt; Меню lt; / title gt;
lt; meta http-Equiv = Content-Type content = text / html; charset = windows-1251 gt;
lt; link href = main. css rel = таблица стилей type = text / css gt;
lt; script language = JavaScript gt;
function makeMenu () {
var xmlMenu = new ActiveXObject ( Microsoft. XMLDOM );
xmlMenu.async = false quot ;;
xmlMenu.load ( menu.xml );
nodes = xmlMenu .documentElement.childNodes;
content = ‘ lt; table width= 150 border = 0 gt; # 8217 ;;
for (a = 0; a lt; nodes. length; a ++) {
mouseOver = nodes.item (a) .getAttribute ( onmouseover );
if (mouseOver == null) {
mouseOver = xmlMenu.documentElement.getAttribute ( onmouseover );
}
для (b = 0; b lt; nodes.item (a) .childNodes.length ; b ++) {
if (nodes.item (a) .childNodes.item (b) .nodeName == # 8217; title # 8217;) {
title = nodes.item (a) .childNodes.item (b) .text;
}
else if (nodes.item (a) .childNodes.item (b) .nodeName == # 8217; style # 8217;) {
style = nodes.item (a) .childNodes.item (b) .text;
}
else if (nodes.item (a) .childNodes.item (b) .nodeName == # 8217; link # 8217;) {
link = nodes.item (a) .childNodes.item (b). text;
}
}
content + = ‘ lt; tr gt; lt; td gt; lt; a href = # 8217; + ссылка + # 8216; class = # 8217; + стиль + # 8216; onmouseover = # 8217; + mouseOver + # 8216; gt; # 8217; + title + # 8216; lt; / a gt; lt; / td gt; lt; / tr gt; # 8217 ;;
}
content + = ‘ lt; / table gt; # 8217 ;;
документ. все меню. innerHTML = content;
}
lt; / script gt;
lt; / head gt;
lt; body gt;
lt; a href = # onclick = makeMenu () gt; Меню формы lt; / a gt; lt; br gt; lt; br gt;
lt; div id = menu gt; lt; / div gt;
lt; / body gt;
lt; / html gt;

Итак, давайте проанализируем функцию makeMenu (). Первая строка создает объект, в который мы загрузим XML-документ. Вторая строка сообщает нам, что обработка XML-документа не начнется, пока он не будет полностью загружен. Затем мы говорим, какой файл нужно загрузить. Затем мы присваиваем структуру дочерних элементов корневого тега переменным узлам. Другими словами, узлы переменных содержат все элементы внутри lt; menu gt; lt; / menu gt; в нашем XML-документе. Именно параметр childNodes указывает, что мы хотим работать с корневыми дочерними узлами
(xmlMenu — это созданный нами объект, в который был загружен XML-файл; documentElement — корневой элемент; childNodes — дочерние элементы текущего узла). Затем переменной содержимого, в которой мы будем сохранять сгенерированное меню, присваивается начальное значение в виде тега открытой таблицы (позже мы добавим строки таблицы и закончим закрывающим тегом lt; / table gt;) . Затем запускаем цикл, количество витков которого соответствует количеству дочерних узлов основного элемента (nodes.length). Затем мы пытаемся присвоить переменной mouseOver значение атрибута onmouseover текущего узла: nodes.item (a) определяет текущий элемент — в скобках указан индекс (порядковый номер, начинающийся с нуля) дочернего узла в текущий родительский узел, т.е. в узле lt; menu gt; мы перечисляем дочерние узлы lt; unit gt;, а выражение nodes.item (0), nodes.item (1), nodes.item (2) указывает на каждый из узлов lt; unit gt; соответственно . Если мы не находим значение атрибута onmouseover в текущем узле, мы переходим на один уровень вверх к родительскому узлу и смотрим туда (оно было предоставлено нами при создании файла XML). Для узла lt; unit gt; нам нужно посмотреть на дочерние узлы и извлечь оттуда необходимые данные (текст ссылки, сама ссылка и ее стиль). Итак, мы спускаемся на уровень ниже и говорим, что хотим просмотреть дочерние узлы текущего узла (текущий узел — lt; item gt;): nodes.item (a) .childNodes. Проходит цикл (трижды, потому что у нас три параметра — три узла), затем в переменных заголовка, ссылки и стиля у нас есть необходимые значения, а затем мы добавляем строку таблицы с пунктом меню в переменную содержимого. Атрибут nodeName текущего узла возвращает имя тега (заголовок, стиль, ссылка), а текстовый атрибут возвращает содержимое узла (О нас, menu1, about.html). Наконец, мы закрываем таблицу и вставляем значение переменной содержимого в слой ( lt; div gt;). Это завершает наше меню.

Естественно, если в меню всего три пункта, это не лучшая идея с точки зрения скорости и размера, но если у нас больше дюжины пунктов, мы действительно выигрываем. Помимо чтения, JavaScript позволяет добавлять и удалять узлы и изменять атрибуты.Чтобы добавить узел, нам необходимо предоставить следующие данные:

newnode = xmlMenu.createElement ( newnodename );
newtext = xmlMenu. createTextNode (Новое содержимое узла);
newnode.appendChild (newtext);
xmlMenu.documentElement.appendChild (newnode);

newnodename — это имя тега, в котором узел должен быть создан. Используйте следующий код для установки атрибута:

nodes.item (a) .setAttribute ( newattribute ) = Значение атрибута;

Newattribute — это имя атрибута, который будет создан.

Несколько заключительных советов.

При создании приложения для внутреннего использования (в вашей локальной сети) размер файла .xml не важно. Однако помните, что скорость Интернета недостаточна, чтобы заставить вас забыть об оптимизации XML-документов (даже если скорость позволяет это, зачем вам без необходимости увеличивать трафик?). У вас может быть две версии файла .xml: одна для разработка и структурная ориентация, а другой (сокращенный) — для пользователей. Существенная экономия может быть достигнута на именах тегов. Вы не хотите злоупотреблять длинными значениями атрибутов. Вот как может выглядеть наш XML-файл, размещенный и доступный в Интернете:

lt ;? Xml version = 1. 0 encoding = windows-1251 ? Gt;
lt; m omo = mOver1 () gt;
lt; u gt;
lt; t gt; О нас lt; / t gt;
lt; s gt; menu1 lt; / s gt;
lt; l gt; o. html lt; / l gt;
lt; / u gt;
lt; / m gt;

Эта структура значительно экономит трафик; дополнительно у нас есть полная версия для навигации по структуре. Например, довольно часто в коде используется объект document.all. Это можно легко присвоить переменной: DA = document.all, а затем использовать в таких конструкциях, как DA.menu.innerHTML = content.

Старайтесь использовать строчные буквы в именах атрибутов и узлов, чтобы избежать путаницы (узлы чувствительны к регистру.)

Удачи!

Оцените статью