Современные языки и технологии программирования
DESCRIPTION
Современные языки и технологии программирования. Введение в XML. Предпосылки – SGML. SGML – Standard Generalized Markup Language – предназначен для обеспечения обмена информации между различными компаниями и информационными системами 1980 год , IBM, DEC, Налоговая полиция США - PowerPoint PPT PresentationTRANSCRIPT
Современные языки и технологии программирования
Введение в XML
Предпосылки – SGML SGML – Standard Generalized Markup Language –
предназначен для обеспечения обмена информации между различными компаниями и информационными системами
1980 год, IBM, DEC, Налоговая полиция США Описание формата документа DTD (Document
Type Definition) Редкая процедура пересмотра стандарта,
сложность внесения изменений Требует высоких накладных расходов на разбор и
валидацию
Предспосылки - HTML Основан на SGML и предназначен для
представления информации в обозревателях WEB
Поддерживает гиперссылки Ориентирован на визуальное представление
содержимого и форматирование В общем случае HTML документы не являются
корректными (валидными) SGML документами Фиксированный набор тегов, с невозможностью
задания собственных данных
XML – Требования и цели1. Должен быть готов для использования в Internet2. Должен поддерживаться многими приложениями3. Должен быть совместим с SGML4. Создание программ использующих 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:<?xml version=“1.0” standalone=“yes” encoding=“UTF-8”?>
Определение типа документа (DTD)<!DOCTYPE RootElementName PUBLIC “ID” SYSTEM “URL” [ ]>
Корневой элемент<RootElementName> </RootElementName>
Комментарии<!-- Multi line text comment goes here -->
Инструкции обработки<? OrderValidation creditCheck checkCustomer ?>
Специальные последовательности < используется для знака < > используется для знака > & используется для & " используется для “ ' используется для ‘ & шестнадцатиричный код символа & десятичный код символа Символьные данные не подлежащие
разбору:<![CDATA[ Don’t parse this staff >_< ]]>
Пример документа<?xml version="1.0" standalone="no"?> <!DOCTYPE person SYSTEM
"http://somewhere.com/dtds/person.dtd"><!-- Famous mathematician --><person born=‘1912-06-23’ died=“1954-06-07”>
<name first=“Alan” last=“Turing”/> <profession>computer scientist</profession> <profession>mathematician</profession> <profession>cryptographer</profession><biography>
<![CDATA[ <Long story> ]]> </biography>
</person>
Пример DTD
<!-- person.dtd --><!ELEMENT person (name, profession*, biography?)> <!ATTLIST person born CDATA #REQUIRED
died CDATA #IMPLIED><!ELEMENT name EMPTY><!ATTLIST name first CDATA #REQUIRED
last CDATA #REQUIRED> <!ELEMENT profession (#PCDATA)> <!ELEMENT biography (#PCDATA)>
Атрибуты или элементы? Элементы задают сущности (объекты) Атрибуты задают свойства объекта В элементе может быть не более одного
атрибута с заданным именем Атрибуты не могут иметь структуры Атрибуты эффективнее и лаконичнее Использование атрибутов упрощает доступ к
ним при использовании SAX и DOM Если вы не уверены что использовать в
конкретном случае – используйте элементы
Document Type Definition Определеяет:
Вложенность элементов Ограничения на количество и наличие элементов Разрешенные атрибуты элементов Типы атрибутов и значения по умолчанию Сущности (ENTITY)
Не определяет: Ограничения на содержимое атрибутов и
элементов (формат числовых значений, длины строк и т.д.)
Собственные типы данных и отношения между ними
DTD - декларация PUBLIC – публичный идентификатор для
загрузки внешнего DTD по известному имени или URL
SYSTEM – системный URL для загрузки DTD<!DOCTYPE spec
PUBLIC "-//W3C//DTDSpecification::19980910//EN" "http://www.w3.org/XML/1998/06/xmlspec-19980910.dtd">
<!DOCTYPE person SYSTEM “person.dtd”>
Встроенная декларация<!DOCTYPE anydata [
<!ELEMENT anydata ANY>]>
DTD Описание элементов<!ELEMENT Single (SingleChild)>
<!ELEMENT Composite (Child1, Child2, Child3)>
<!ELEMENT OneOrMany (RequiredMultiChild+)>
<!ELEMENT ContainAny (OptionalMultiChild*)>
<!ELEMENT OneOrZero (OptionalChild?)>
<!ELEMENT Name (FirstName, MiddleName*, LastName?)> <!ELEMENT ContainsData (#PCDATA)*>
<!ELEMENT OneOrAnother (Option | Alternative)>
<!ELEMENT Paragraph (#PCDATA | Name | Profession | Footnote | Emphasize | Date )* >
<!ELEMENT EmptyOne EMPTY>
<!ELEMENT AnyContent ANY>
DTD примитивы Подстановка &MC; текстом Master Card<!ENTITY MC “Master Card”>
Внешний примитив (должен быть well formed и будет подвержен разбору)
<!ENTITY footer SYSTEM “/texts/footer.xml”>
Внешний не подвергаемый разбору примитив<!ENTITY logo SYSTEM “/images/logo.jpeg” NDATA jpg>
Параметрическая сущность (только внутри DTD):
<!ENTITY % colors “(red|green|blue)”><!ELEMENT point color %colors; #REQUIRED>
DTD описание атрибутов<!ATTLIST ElemName AttrName Type Requirement>Requirement::= #IMPLIED | #REQUIRED | #FIXED literalType :== CDATA | NMTOKEN | NMTOKENS | ENTITY |
ENTITIES | ID | IDREF | IDREFS | NOTATION | Enum CDATA – текст NMTOKEN – токен (с буквы, без пробела) NMTOKENS – токены через пробелы ID – уникальный идентификатор (для всего
документа) IDREF – ссылка на уникальный или уникальные
(IDREFS) идентификаторы через пробелы ENTITY содержимое должно быть именем примитива,
неподвергаемого разбору ENTITIES – разделенные пробелом неразбираемые
примитивы
DTD описание атрибутов Enum – список фиксированных значений разделенных |
<!ATTLIST date month (January | February | March | April | May | June | July | August | September |
October | November | December) #REQUIRED> NOTATION – имя нотации определенной в документе
<!NOTATION gif SYSTEM "image/gif">
<!NOTATION tiff SYSTEM "image/tiff">
<!NOTATION jpeg SYSTEM "image/jpeg">
<!NOTATION png SYSTEM "image/png">
<!ATTLIST image type NOTATION (gif | tiff | jpeg |
png) #REQUIRED>
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.Определить DTD3.Написать пример документа,
провалидировать его 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.newDefaultHandler.newjava.lang.Thread.new {puts “Thread started”}