Современные языки и технологии программирования Введение в XML
Предпосылки – SGML SGML – Standard Generalized Markup Language – предназначен для обеспечения обмена информации между различными компаниями и информационными системами 1980 год, IBM, DEC, Налоговая полиция США Описание формата документа DTD (Document Type Definition) Редкая процедура пересмотра стандарта, сложность внесения изменений Требует высоких накладных расходов на разбор и валидацию
Предспосылки - HTML Основан на SGML и предназначен для представления информации в обозревателях WEB Поддерживает гиперссылки Ориентирован на визуальное представление содержимого и форматирование В общем случае HTML документы не являются корректными (валидными) SGML документами Фиксированный набор тегов, с невозможностью задания собственных данных
XML – Требования и цели 1. Должен быть готов для использования в Internet 2. Должен поддерживаться многими приложениями 3. Должен быть совместим с SGML 4. Создание программ использующих XML должно быть простым 5. Число необязательных возможностей языка должно быть сведено к минимуму 6. Документы должны быть понятны человеку 7. Дизайн XML должен разрабатываться быстро 8. Спецификация XML должна быть чекой и краткой 9. Создание XML документов должно быть простым 10. Краткость команд разметки XML не имеет значения
Группа технологий XML Extensible Markup Language (XML) 1.0/1.1 XML Namespaces - пространства имен XML Schema – схемы XML XPath – XML Path Language XLink – XML Linking Language XPointer – XML Pointer Language XSL/XSLT – Extensible Stylesheet Language/Transformation SAX – Simple API for XML – (потоки и события) DOM – Document Object Model (элементы, узлы, дерево, редактирование и сериализация) JAXB – Java Architecture for XML Binding
Правильный (well-formed) документ XML У каждого элемента должен быть открывающий и закрывающий теги В документе должен быть только один корневой элемент Названия элементов и атрибутов чувствительны к регистру Элементы могут быть вложены друг в друга но не могут пересекаться Некоторые символы должны предваряться управляющими символами или замещаться последовательностями специальных символов Значения атрибутов должны быть взяты в кавычки (двойные либо апострофы) Пустые элементы должны иметь особый формат
Структура XML документа Документ (1.0) должен содержать символы следующих диапазонов: Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] Объявление (заголовок) XML: Определение типа документа (DTD) Корневой элемент Комментарии Инструкции обработки
Специальные последовательности < используется для знака < > используется для знака > & используется для & " используется для ' используется для & шестнадцатиричный код символа & десятичный код символа Символьные данные не подлежащие разбору: _
Пример документа computer scientist mathematician cryptographer ]]>
Пример DTD
Атрибуты или элементы? Элементы задают сущности (объекты) Атрибуты задают свойства объекта В элементе может быть не более одного атрибута с заданным именем Атрибуты не могут иметь структуры Атрибуты эффективнее и лаконичнее Использование атрибутов упрощает доступ к ним при использовании SAX и DOM Если вы не уверены что использовать в конкретном случае – используйте элементы
Document Type Definition Определеяет: Вложенность элементов Ограничения на количество и наличие элементов Разрешенные атрибуты элементов Типы атрибутов и значения по умолчанию Сущности (ENTITY) Не определяет: Ограничения на содержимое атрибутов и элементов (формат числовых значений, длины строк и т.д.) Собственные типы данных и отношения между ними
DTD - декларация PUBLIC – публичный идентификатор для загрузки внешнего DTD по известному имени или URL SYSTEM – системный URL для загрузки DTD Встроенная декларация
DTD Описание элементов
DTD примитивы Подстановка &MC; текстом Master Card Внешний примитив (должен быть well formed и будет подвержен разбору) Внешний не подвергаемый разбору примитив Параметрическая сущность (только внутри DTD):
DTD описание атрибутов Requirement::= #IMPLIED | #REQUIRED | #FIXED literal Type :== CDATA | NMTOKEN | NMTOKENS | ENTITY | ENTITIES | ID | IDREF | IDREFS | NOTATION | Enum CDATA – текст NMTOKEN – токен (с буквы, без пробела) NMTOKENS – токены через пробелы ID – уникальный идентификатор (для всего документа) IDREF – ссылка на уникальный или уникальные (IDREFS) идентификаторы через пробелы ENTITY содержимое должно быть именем примитива, неподвергаемого разбору ENTITIES – разделенные пробелом неразбираемые примитивы
DTD описание атрибутов Enum – список фиксированных значений разделенных | NOTATION – имя нотации определенной в документе
JAXP Java API for XML Processing SAX (Simple API for XML) javax.xml.parsers.SAXParser Требует мало памяти Потоковая обработка, событийная модель DOM (Document Object Model) javax.xml.parsers.DocumentBuilder Строит дерево «узлов» документа Позволяет редактировать документ XSLT javax.xml.transform.Transformer
SAX Simple API for XML (Java)
Работа с SAX Реализовать свой обработчик наследуя класс org.xml.sax.helpers.DefaultHandler, реализующий интерфейсы: ContentHandler DTDHandler EntityResolver ErrorHandler Получить объект парсера SAXParserFactory f = SAXParserFactory.newInstance(); SAXParser p = f.newSAXParser(); Запустить разбор документа p.parse(new InputSource(…), myHandler);
Document Object Model
Работа с DOM Получить разборщик документа DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Получить объект документа Document doc = builder.parse(new InputSource(…)); Работать с элментами документа Element root = doc.getDocumentElement(); root.getChildNodes(); root.getElementsByTagName(); Основной класс дерева - Node
Сохранение документа DOM Создать трансформер TransformerFactory factory = TransformerFactory.newInstance(); Transformer t = factory.newTransformer(); Создать объект для трансформации DOMSource docSource = new DOMSource(doc); DOMSource nodeSource = new DOMSource(node); Осуществить сохранение документа (или узла): StreamResult res = new StreamResult(…); t.transform(source, res);
Задача 1. Выбрать задачу (магазин, записная книжка, погода, …) 2. Определить DTD 3. Написать пример документа, провалидировать его 4. Разобрать документ с помощью SAX, подсчитать количество элементов и атрибутов 5. Загрузить с помощью DOM, изменить содержимое 6. Сохранить результат
Использование Java API из JRuby include Java #доступен Java API с полными именами import org.xml.sax.helpers.DefaultHandler #DefaultHandler доступен без квалификации пакета #наследование от Java-класса class MySAXHandler < DefaultHandler #перегрузка метода Java-класса def startElement(uri, localName, qName, attrs) #тело метода end #определение других методов end #создание экземпляра класса (Ruby или Java) MySAXHandler.new DefaultHandler.new java.lang.Thread.new {puts Thread started}