1
1
Fork 0
java-interview/xml.md

192 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[Вопросы для собеседования](README.md)
# XML
+ [Что такое _XML_?](#Что-такое-xml)
+ [Что такое _DTD_?](#Что-такое-dtd)
+ [Чем _well-formed XML_ отличается от _valid XML_?](#Чем-well-formed-xml-отличается-от-valid-xml)
+ [Что такое «_пространство имен_» в XML?](#Что-такое-пространство-имен-в-xml)
+ [Что такое XSD? В чём его преимущества перед XML DTD?](#Что-такое-xsd-В-чём-его-преимущества-перед-xml-dtd)
+ [Какие типы существуют в XSD?](#Какие-типы-существуют-в-xsd)
+ [Какие вы знаете методы чтения XML? Опишите сильные и слабые стороны каждого метода.](#Какие-вы-знаете-методы-чтения-xml-Опишите-сильные-и-слабые-стороны-каждого-метода)
+ [Когда следует использовать _DOM_, а когда _SAX_, _StAX_ анализаторы?](#Когда-следует-использовать-dom-а-когда-sax-stax-анализаторы)?
+ [Какие вы знаете способы записи XML?](#Какие-вы-знаете-способы-записи-xml)
+ [Что такое _JAXP_?](#Что-такое-jaxp)
+ [Что такое _XSLT_?](#Что-такое-xslt)
## Что такое _XML_?
__XML, eXtensible Markup Language (расширяемый язык разметки)__ - язык с простым формальным синтаксисом, хорошо приспособленный для создания и обработки документов программами и одновременно удобный для чтения и создания документов человеком.
XML расширяем, он не фиксирует разметку, используемую в документах, и разработчик волен создавать разметку в соответствии с потребностями конкретной области, будучи ограниченным лишь синтаксическими правилами языка.
[к оглавлению](#xml)
## Что такое _DTD_?
__DTD, Document Type Definition (определение типа документа)__ — это заранее определённый свод правил, задающий связи между элементами и атрибутами.
> Например, DTD для HTML гласит, что тэг `DIV` должен быть внутри тэга `BODY` и может встречаться многократно, `TITLE` — в `HEAD` и всего один раз, а `SCRIPT` и там, и там сколь угодно раз.
DTD обычно описывается непосредственно в документе в виде строки-формулировки, начинающейся с `<!DOCTYPE ... >` или отдельном файле.
[к оглавлению](#xml)
## Чем _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)).__
[к оглавлению](#xml)
## Что такое «_пространство имен_» в XML?
__Пространство имён XML (XML namespace)__ - это идентифицируемая с помощью ссылки URI коллекция имен, используемых в XML документах для обозначения типов элементов и именования атрибутов. Пространство имен XML отличается от тех «пространств имен», которые обычно используются в компьютерных дисциплинах, тем, что в варианте для XML оно имеет внутреннюю структуру, и, с математической точки зрения, набором не является.
> Пространства имён объявляются с помощью XML атрибута `xmlns`, значением которого должен быть _URI_ и префикса, однозначно идентифицирующего пространство имён каждого элемента.
Все имена элементов в пределах пространства имён должны быть уникальны.
В общем случае пространство имён XML не требует, чтобы был определён его словарь.
XML-документ может содержать имена элементов и атрибутов из нескольких словарей XML. В каждом словаре задано своё пространство имён — так разрешается проблема неоднозначности имён элементов и атрибутов.
[к оглавлению](#xml)
## Что такое 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 обладает встроенными средствами документирования, позволяющими создавать самодостаточные документы, не требующие дополнительного описания.
[к оглавлению](#xml)
## Какие типы существуют в XSD?
__Простой тип__ - это определение типа для значения, которое может использоваться в качестве содержимого элемента или атрибута. Этот тип данных не может содержать элементы или иметь атрибуты.
```xsd
<xsd:element name='price' type='xsd:decimal'/>
...
<price>45.50</price>
```
__Сложный тип__ - это определение типа для элементов, которые могут содержать атрибуты и другие элементы.
```xsd
<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>
```
[к оглавлению](#xml)
## Какие вы знаете методы чтения 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.
> Пригоден только для чтения.
[к оглавлению](#xml)
## Когда следует использовать _DOM_, а когда _SAX_, _StAX_ анализаторы?
DOM - естественный выбор, когда объектом предметной области является сам XML: когда нужно знать и иметь возможность изменять структуру документа, а также в случае многократного использования информации из документа.
Для быстрого одноразового чтения оптимальным является использование SAX или StAX.
[к оглавлению](#xml)
## Какие вы знаете способы записи XML?
__Прямая запись__ - пишет XML тег за тегом, атрибут за атрибутом.
> Высокая скорость работы.
> Экономия памяти: при использовании не создаётся промежуточных объектов.
> Пригоден только для записи.
__Запись DOM (Document Object Model)__ - создаёт полную структуру XML и только потом записывает её.
> Низкая скорость работы.
> Не оптимальный расход памяти.
> Пригоден как для записи, так и для чтения.
[к оглавлению](#xml)
## Что такое _JAXP_?
__JAXP, The Java API for XML Processing (Java API для обработки XML)__ — набор API, упрощающих обработку XML данных в программах написанных на Java. Содержит реализации DOM, SAX и StAX парсеров, поддерживает XSLT и возможность работать с DTD.
[к оглавлению](#xml)
## Что такое _XSLT_?
__XSLT, eXtensible Stylesheet Language Transformations__ — язык преобразования XML-документов.
XSLT создавался для применения в _XSL (eXtensible Stylesheet Language)_ - языке стилей для XML. Во время XSL-преобразования XSLT-процессор считывает XML-документ и таблицу(ы) стилей XSLT. На основе инструкций, которые процессор находит в таблице(ах) стилей XSLT, он вырабатывает новый XML-документ или его фрагмент.
[к оглавлению](#xml)
# Источники
+ [Википедия](https://ru.wikipedia.org/wiki/XML)
+ [CIT Forum](http://citforum.ru/internet/xnamsps/index.shtml#ns-decl)
+ [Quizful](http://www.quizful.net/interview/java/xml-and-parsers)
[Вопросы для собеседования](README.md)