среда, 11 апреля 2018 г.

XML. Конспект 2

DTD очень старый формат.
Описание структуры документа - DTD.
Для программного анализа используются парсеры XML.
Парсер – синтаксический анализатор документа.
SAX – Simple API of XML.
DOM – Document Object Model.



Любой элемент документа рассматривается парсером как объект в памяти.
Парсер представляет документ как иреархию объектов.
Объекты DOM – это узлы (node) связанные друг с другом.
Объект Document – основной объект документа. Другие объекты представляют элементы, текст, атрибуты, комментарии и т.д.

Проверка грамматики документа или валидация документа.
Документ может быть не предназначен для вашей системы.
Документ может содержать неправильные данные.
Документ может содержать ошибки в структуре.

Язык описания структуры документа.
Описывает: 
Какие элементы могут присутствовать в документе.
Повторения элементов.
Какие атрибуты могут быть у элементов.
Какие атрибуты обязательны.
Какие сущности могут применятся.

Пример DTD.
<!ELEMENT pricelist (book+)>
<!ELEMENT book (title, author+, price, description?)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!ATTLIST price currency CDATA #IMPLIED>

Последовательность описания здесь не важна.
pricelist - это элемент.
В скобках описывается, что может быть внутри этого элемента.
В DTD мы можем указать либо другой элемент, либо текст.
В pricelist может быть только элемент book.
+ означает, что элементов м.б от 1 до бесконечности.
В элементе book м.б последовательно элементы title (он только один и идет первым), author+ (авторов - от 1 до бесконечности).
CDATA - это текст для атрибутов.
description? - означает, что элементов либо 0, либо 1, т.е его можно писать или не писать.
#PCDATA - это текст, здесь не м.б элеменов.
#IMPLIED - означает, что элемент не обязателен.

Как вставить DTD в XML-документ.

1)Включение.
<?xml version=1.0" encoding="UTF-8"?>
<!DOCTYPE document [
<!ELEMENT document (greeting, message)>
<!ELEMENT greeting (#PCDATA)>
<!ELEMENT message (#PCDATA)>
]>
<document>
<greeting> Hello From XML </greeting>
<message>
Welcome to the wild
and woolly world of XML.
</message>
</document>

2)Внешние определение.
<?xml version = "1.0" standalone="no"?>
<!DOCTYPE document SYSTEM "mydoc.dtd">
<document>
<customer>
...
</customer>
</document>

3)Можно сочетать внешнее и внутреннее определение!

 Модификаторы
* - ноль или много
? – ноль или один
+ - один или много

Альтернативы элементов или пустые элементы.
<!ELEMENT item
(product, number,
(price | chargeacct | sample))>

У нас может быть элемент item, в котором сначала идет product и number, а потом что-то из 3: price | chargeacct | sample.

<!ELEMENT warning EMPTY> - объявление того, что элемент будет пустым.

Объявление атрибута.
<!ATTLIST price
currency CDATA #REQUIRED
symbol CDATA #IMPLIED>

<price currency="USD" symbol="$">12.3</price>

#REQUIRED - обязательный.
#IMPLIED - необязательный.

Объявление сущностей. Сущности - аналог констант.
<!ENTITY today "October 15, 2007">
<!ENTITY company "Roga and Copyta">
<!ENTITY nbsp "October 15, 2003">

Если мы хотим использовать сущности, то пишем:
<?xml version = "1.0"?>
<TEXT>
This text about &company;
is the &nbsp; content.
</TEXT>
Теперь эти сущности будут отражены при парсинге.

Мы можем написать сущности, которые будут ссылаться на другие сущности.
<!ENTITY first "John">
<!ENTITY last "Smith">
<!ENTITY name "&first; &last;">


######ЛАБОРАТОРНАЯ#########
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE document [
<!ELEMENT timeTable (offices, lesson+) >
<!ELEMENT offices (office+) >
<!ELEMENT office (name, address) >
<!ELEMENT name (#PCDATA) >
<!ELEMENT address (#PCDATA) >
<!ATTLIST office code ID #REQUIRED >
<!ELEMENT lesson (date, time) >
<!ELEMENT date (#PCDATA) >
<!ELEMENT time (#PCDATA) >
<!ATTLIST lesson no CDATA #REQUIRED >
]>
<timeTable>
<offices>
<office code="РА">
<name>Комплекс "Радио"</name>
<address>ул. Бакунинская, д.71</address>
</office>
<office code="БК">
<name>Комплекс "Бакунинский"</name>
<address>ул. Радио, д.24</address>
</office>
</offices>

<lesson no="1">
<date>2012-03-21</date>
<time>18:30:00</time>
</lesson>
<lesson no="2">
<date>2012-03-22</date>
<time>19:30:00</time>
</lesson>
</timeTable>

#############################

Недостатки DTD.
Отличный от XML синтаксис языка.
Нельзя поставить документу в соответствие два и более DTD описаний (актуально для составных документов).
Нет проверки типов данных.

XML-СХЕМЫ. ОПИСАНИЕ СТРУКТУРЫ ДОКУМЕНТА

Унифицированный способ описания структуры.
http://www.w3.org/XML/Schema
Промышленный стандарт описания XML документа
Описывает:
словарь (названия элементов и атрибутов),
модель содержания (отношения между элементами и атрибутами и их структура),
типы данных.

Пример простой схемы.
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="страна" type="Страна"/>
<xs:complexType name="Страна">
<xs:sequence>
<xs:element name="название" type="xs:string"/>
<xs:element name="население" type="xs:decimal"/>
</xs:sequence>
</xs:complexType>
</xs:schema>

Этой схеме соответствует кусок XML:
<страна>
<название>Франция</название>
<население>59.7</население>
</страна>

Для задания пространства имен используются префиксы: xs или xsd.

Как сопоставить схему и документ?
Схема описывает пространство имен. В идеале одна схема описывает одно пространство имен.

Способ 1. Описание схемы для пространства имен.
XML-схема
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.camera.org"
xmlns="http://www.camera.org"
xmlns:nikon="http://www.nikon.com"
xmlns:olympus="http://www.olympus.com"
xmlns:pentax="http://www.pentax.com" elementFormDefault="unqualified">

Префиксы: xmlns:nikon, xmlns:olympus, xmlns:pentax.

Как схему прикрепить к документу?
<?xml version="1.0"?>
<my:camera xmlns:my="http://www.camera.org"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - тут описано, что такое schemaLocation
xsi:schemaLocation="http://www.camera.org/Camera.xsd"> - где схема находится. Этот элемент не входит в стандартную комплектацию.

Но что делать, если нет пространства имен?
Способ 2. Привязка схемы к документу без указанного пространства имен имен.
<?xml version="1.0" encoding="utf-8"?>
<root
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="myschema.xsd">
<name>Вася Пупкин</name>
<myAge>24</myAge>
</root>

Структура XML-схемы.
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!-- Элементы схемы -->
<xsd:annotation>
<xsd:documentation>
Моя схема
</xsd:documentation>
</xsd:annotation>
...
</xsd:schema>

Описание простых элементов.
<?xml version="1.0" encoding="utf-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="name" type="xs:string" />
</xs:schema>

Он-лайн валидатор: https://www.freeformatter.com/xml-validator-xsd.html

Описание сложных типов.
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType> - это элемент комплексного типа
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="myAge" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

Типы данных.
simpleType - что-то вроде скаляра, единичный элемент, в который ничего нельзя вложить, например, колонка в БД,
complexType - это таблица, в которую что-то вкладывается.
Поименованный и Безымянный.

Типы данных, иерархия базовых типов: https://www.w3.org/TR/xmlschema-2/

Комментариев нет:

Отправить комментарий

Materialize-css. Футер

Сделаем футер и прижмем к низу страницы. Документация: https://materializecss.com/footer.html