260 likes | 487 Views
Современные языки и технологии программирования. Введение в XML. Предпосылки – SGML. SGML – Standard Generalized Markup Language – предназначен для обеспечения обмена информации между различными компаниями и информационными системами 1980 год , IBM, DEC, Налоговая полиция США
E N D
Современные языки и технологии программирования Введение в XML
Предпосылки – SGML • SGML – Standard Generalized Markup Language – предназначен для обеспечения обмена информации между различными компаниями и информационными системами • 1980 год, IBM, DEC, Налоговая полиция США • Описание формата документа DTD (Document Type Definition) • Редкая процедура пересмотра стандарта, сложность внесения изменений • Требует высоких накладных расходов на разбор и валидацию
Предспосылки - HTML • Основан на SGML и предназначен для представления информации в обозревателях WEB • Поддерживает гиперссылки • Ориентирован на визуальное представление содержимого и форматирование • В общем случае HTML документы не являются корректными (валидными) SGML документами • Фиксированный набор тегов, с невозможностью задания собственных данных
XML – Требования и цели • Должен быть готов для использования в Internet • Должен поддерживаться многими приложениями • Должен быть совместим с SGML • Создание программ использующих XML должно быть простым • Число необязательных возможностей языка должно быть сведено к минимуму • Документы должны быть понятны человеку • Дизайн XML должен разрабатываться быстро • Спецификация XML должна быть чекой и краткой • Создание XML документов должно быть простым • Краткость команд разметки 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) <!DOCTYPERootElementName 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 <!ENTITYMC “Master Card”> • Внешний примитив(должен быть well formed и будет подвержен разбору) <!ENTITYfooter 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 ElemNameAttrNameTypeRequirement> 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 – список фиксированных значений разделенных | <!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 • Реализовать свой обработчик наследуя класс org.xml.sax.helpers.DefaultHandler, реализующий интерфейсы: • ContentHandler • DTDHandler • EntityResolver • ErrorHandler • Получить объектпарсера SAXParserFactory f = SAXParserFactory.newInstance(); SAXParser p = f.newSAXParser(); • Запустить разбор документа p.parse(new InputSource(…), myHandler);
Работа с 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);
Задача • Выбрать задачу (магазин, записная книжка, погода, …) • Определить DTD • Написать пример документа, провалидировать его • Разобрать документ с помощью SAX, подсчитать количество элементов и атрибутов • Загрузить с помощью DOM, изменить содержимое • Сохранить результат
Использование 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”}