1. Что такое XML?

XML, eXtensible Markup Language (расширяемый язык разметки) - язык с простым формальным синтаксисом, хорошо приспособленный для создания и обработки документов программами и одновременно удобный для чтения и создания документов человеком.

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

2. Что такое DTD?

DTD, Document Type Definition (определение типа документа) — это заранее определённый свод правил, задающий связи между элементами и атрибутами.

Например, DTD для HTML гласит, что тэг DIV должен быть внутри тэга BODY и может встречаться многократно, TITLE — в HEAD и всего один раз, а SCRIPT — и там, и там сколь угодно раз.

DTD обычно описывается непосредственно в документе в виде строки-формулировки, начинающейся с <!DOCTYPE ... > или отдельном файле.

3. Чем well-formed XML отличается от valid XML?

В зависимости от уровня соответствия стандартам документ может быть «well-formed» («правильно построенный»), либо «valid» («действительный»).

Основные признаки well-formed XML следуют из формального описания стандарта:

  • Документ имеет ровно один корневой элемент, в котором лежат все остальные. То есть, <document>...</document><appendix>...</appendix> - это не XML-документ.

  • Все открытые теги обязаны быть закрыты. HTML, например, допускает не закрывать многие теги (<p>, <body>, <li>, <td> и многие другие). В XML так делать нельзя.

  • Для одиночных тегов (типа <br>) , чтобы отличать их от открывающих, предусмотрена специальная запись: <br/>. Но можно написать и полностью <br></br>.

  • Имена тегов регистрозависимые. Если вы открываете тег <SiteDescription>, то его надо закрывать именно таким же, </sitedescription> не допускается.

  • Теги не могут нарушать вложенность. Вот такого не должно быть: <em><b>...</em></b>.

  • Все атрибуты тегов обязаны быть заключены в двойные кавычки (").

  • Есть три символа - <, > и &, которые обязаны быть экранированы везде с помощью &lt;, &gt; и &amp;. Внутри атрибутов надо экранировать еще и двойную кавычку с помощью &quot;.

  • Все символы в документе обязаны соответствовать заявленной кодировке.

Документ является valid, если он сформирован с соблюдением всех синтаксических правил корректности конкретного XML, т.е. соответствует DTD.

well-formed XML - корректен синтаксически (может быть разобран парсером), а valid XML - корректен как синтаксически так и семантически (удовлетворяет правилам заранее описанных словаря и грамматики (DTD)).

4. Что такое «пространство имен» в XML?

Пространство имён XML (XML namespace) - это идентифицируемая с помощью ссылки URI коллекция имен, используемых в XML документах для обозначения типов элементов и именования атрибутов. Пространство имен XML отличается от тех «пространств имен», которые обычно используются в компьютерных дисциплинах, тем, что в варианте для XML оно имеет внутреннюю структуру, и, с математической точки зрения, набором не является.

Пространства имён объявляются с помощью XML атрибута xmlns, значением которого должен быть URI и префикса, однозначно идентифицирующего пространство имён каждого элемента.

Все имена элементов в пределах пространства имён должны быть уникальны.

В общем случае пространство имён XML не требует, чтобы был определён его словарь.

XML-документ может содержать имена элементов и атрибутов из нескольких словарей XML. В каждом словаре задано своё пространство имён — так разрешается проблема неоднозначности имён элементов и атрибутов.

5. Что такое XSD? В чём его преимущества перед XML DTD?

XSD, XML Schema Definition, XML Schema (XML схема) — язык описания структуры XML-документа. В частности, XML Schema описывает:

  • словарь - имена элементов и атрибутов;

  • модель содержания - взаимосвязи между элементами и атрибутами, а также их

  • структуру документа;

  • используемые типы данных.

Преимущества XSD перед DTD заключаются в следующем:

  • DTD, в отличии от XSD, не является XML и имеет свой собственный синтаксис. В связи с этим могут возникать разнообразные проблемы с кодировкой и верификацией XML-документов.

  • При использовании XSD XML-парсер может проверить не только правильность синтаксиса XML документа, но также его структуру, модель содержания и типы данных. В XML DTD существует лишь один тип данных — строка и если, например, в числовом поле будет текст, то документ всё же сможет пройти верификацию, так как XML DTD не сможет проверить тип данных.

  • Нельзя поставить в соответствие одному XML документу больше одного DTD. А следовательно, и верифицировать документ можно лишь одним DTD описанием. XSD расширяем, и позволяет подключать несколько словарей для описания типовых задач.

  • XSD обладает встроенными средствами документирования, позволяющими создавать самодостаточные документы, не требующие дополнительного описания.

6. Какие типы существуют в XSD?

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

<xsd:element name='price' type='xsd:decimal'/>
...
<price>45.50</price>

Сложный тип - это определение типа для элементов, которые могут содержать атрибуты и другие элементы.

<xsd:element name='price'>
    <xsd:complexType base='xsd:decimal'>
        <xsd:attribute name='currency' type='xsd:string'/>
    </xsd:complexType>
</xsd:element>
...
<price currency='US'>45.50</price>

7. Какие вы знаете методы чтения XML? Опишите сильные и слабые стороны каждого метода.

DOM (Document Object Model) - объектный - считывает XML, воссоздавая его в памяти в виде объектной структуры при этом XML документ представляется в виде набора тегов — узлов. Каждый узел может иметь неограниченное количество дочерних узлов. Каждый дочерний тоже может содержать несколько уровней потомков или не содержать их вовсе. Таким образом в итоге получается некое дерево.

➖ Низкая скорость работы.

➖ Расходует много памяти.

➕ Прост в программировании.

➕ Если в XML много объектов с перекрёстными ссылками друг на друга, достаточно дважды пройтись по документу: первый раз создать объекты без ссылок и заполнить словарь «название-объект», второй раз — восстановить ссылки.

➕ При ошибке в XML в памяти остаётся полусозданная структура XML, которая будет автоматически уничтожена.

➕ Пригоден как для чтения так и для записи.

SAX (Simple API for XML) событийный - читает XML документ, реагируя на появляющиеся события (открывающий или закрывающий тег, строку, атрибут) вызовом предоставляемых приложением обработчиков событий. При этом, в отличии от DOM, не сохраняет документ в памяти.

➕ Высокая скорость работы

➕ Расходует мало памяти.

➗ Довольно сложен в программировании.

➖ Если в XML много объектов с перекрёстными ссылками друг на друга, надо организовать временное хранение строковых ссылок, чтобы потом, когда документ будет считан, преобразовать в указатели.

➖ При ошибке в XML в памяти остаётся полусозданная структура предметной отрасли; программист должен своими руками корректно уничтожить её.

➖ Пригоден только для чтения.

StAX (Stream API for XML) потоковый - состоящий из двух наборов API для обработки XML, которые обеспечивают разные уровни абстракции. API с использованием курсора позволяет приложениям работать с XML как с потоком лексем (или событий); приложение может проверить статус анализатора и получить информацию о последней проанализированной лексеме, а затем перейти к следующей. Второй, высокоуровневый API, использующий итераторы событий, позволяет приложению обрабатывать XML как серию объектов событий, каждый из которых взаимодействует с фрагментом XML-структуры приложения. Всё, что требуется от приложения - это определить тип синтаксически разобранного события, отнести его к соответствующему конкретному типу и использовать соответствующие методы для получения информации, относящейся к событию.

➗ Сохраняет преимущества, которые есть в SAX по сравнению с DOM.

➕ Не основан на обратных вызовах обработчиков, приложению не придется обслуживать эмулированное состояние анализатора, как это происходит при использовании SAX.

➖ Пригоден только для чтения.

8. Когда следует использовать DOM, а когда SAX, StAX анализаторы?

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

Для быстрого одноразового чтения оптимальным является использование SAX или StAX.

9. Какие вы знаете способы записи XML?

Прямая запись - пишет XML тег за тегом, атрибут за атрибутом.

➕ Высокая скорость работы.

➕ Экономия памяти: при использовании не создаётся промежуточных объектов.

➖ Пригоден только для записи.

Запись DOM (Document Object Model) - создаёт полную структуру XML и только потом записывает её.

➖ Низкая скорость работы.

➖ Не оптимальный расход памяти.

➕ Пригоден как для записи, так и для чтения.

10. Что такое JAXP?

JAXP, The Java API for XML Processing (Java API для обработки XML) — набор API, упрощающих обработку XML данных в программах написанных на Java. Содержит реализации DOM, SAX и StAX парсеров, поддерживает XSLT и возможность работать с DTD.

11. Что такое XSLT?

XSLT, eXtensible Stylesheet Language Transformations — язык преобразования XML-документов.

XSLT создавался для применения в XSL (eXtensible Stylesheet Language) - языке стилей для XML. Во время XSL-преобразования XSLT-процессор считывает XML-документ и таблицу(ы) стилей XSLT. На основе инструкций, которые процессор находит в таблице(ах) стилей XSLT, он вырабатывает новый XML-документ или его фрагмент.

12. Источники