190 lines
18 KiB
Markdown
190 lines
18 KiB
Markdown
[Вопросы для собеседования на Java Junior](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>`.
|
||
+ Все атрибуты тегов обязаны быть заключены в двойные кавычки (`"`).
|
||
+ Есть три символа - `<`, `>` и `&`, которые обязаны быть экранированы везде с помощью `<`, `>` и `&`. Внутри атрибутов надо экранировать еще и двойную кавычку с помощью `"`.
|
||
+ Все символы в документе обязаны соответствовать заявленной кодировке.
|
||
|
||
Документ является _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)
|