Web-технологии и web-дизайн
Валидация XML Лекции №10-11
Керносов М.А.
Факультет компьютерных наук Кафедра ИУС
Правильно сформированный XML-документ...
Правильно сформированный (well-formed) XML- документ удовлетворяет синтаксическим правилам XML:
начинается с XML-декларации;
сдержит один уникальный корневой элемент;
все теги закрыты (для каждого открывающего тега должен существовать соответствующий ему закрывающий тег);
имена элементов записаны с учетом их чувствительности к регистру;
все элементы правильно вложены;
все значения атрибутов взяты в кавычки;
для добавления в документ спецсимволов используются сущности-заменители.
не позволяет избежать ошибок!
Даже правильно сформированные с точки зрения синтаксиса XML (well-formed) документы могут содержать ошибки в их логической структуре, последствия которых могут быть достаточно серьёзными.
С помощью технологий DTD & XML Schema, большинство логических ошибок могут быть обнаружены во время валидации XML- документов.
DTD (Document Type Definition) - определение типа документа.
XSD (XML Schema Definition) - определение XML- схемы.
Назначение DTD и XSD заключается в определении допустимых «строительных блоков» XML- документов.
DTD & XSD определяют структуру документа с помощью перечня допустимых элементов и атрибутов.
XML-документ, прошедший валидацию посредством DTD или XSD называется "Валидным" (Valid).
Для чего следует использовать
DTD или XSD?
DTD или XSD, позволяют добавить к XML- файлам описание их формата.
Независимые группы людей могут договориться об использовании стандартного DTD или XSD
для обмена данными.
Программные приложения могут использовать стандартный DTD или XSD для проверки того, что данные, полученные извне, валидные.
Данные технологии могут быть применены для
проверки пользовательских данных (например, в html, xhtml...).
«Строительные блоки» XML
С точки зрения DTD или XSD все XML- документы (и HTML-документы также) состоят из таких «строительных блоков»:
Элементы (Elements);
Атрибуты (Attributes);
Сущности (Entities);
Обрабатываемые текстовые данные (PCDATA);
Текстовые данные (СDATA).
Элементы являются основными строительными блоками XML- и HTML-документов.
Примерами HTML-элементов являются теги "body" и "table":
<body>some text</body>
Примерами XML-элементом могли бы быть теги "note" и "message".
<message>some text</message>
Элементы могут содержать текст, другие элементы, или быть пустыми.
Примерами пустых HTML-элементов являются теги "hr", "br" и "img" (<br></br>, <br />).
Атрибуты
Атрибуты предоставляют дополнительную информацию об элементах.
Атрибуты всегда располагаются внутри открывающего тега элемента.
Атрибуты всегда записываются в виде пар имя/значение.
Пример: следующий элемент "img" содержит дополнительную информацию о файле с изображением:
<img src-'computer.gif'/>
Некоторые символы в XML имеют специальное значение. Например знак «меньше» (<), который определяет начало XML-тега.
Наиболее распространённой сущностью в HTML является: " " (неразрывный пробел)".
Сущности расширяются (заменяются на соответствующие им символы) когда документ обрабатывается XML-парсером.
Предопределённые сущности в
XML
Ссылка на сущность |
Символ |
< |
< |
> |
> |
& |
& |
" |
и |
' |
1 |
Сложный тип, содержащий
только текст
Данный тип содержит только простое содержимое (simple content) - текст и атрибуты, поэтому его содержимое обрамляется тегом simpleContent.
Когда используется простое содержимое, внутри тега simpleContent должно быть обязательно объявлено расширение (extension) ИЛИ ограничение (restriction) базового типа.
<xs:element name="somename"> <xs:complexType> <xs:simpleContent> <xs:extension base="basetype">
</xs:extension> </xs:simpleContent> </xs:complexType> </xs:element>
ИЛИ
<xs:element name="somename"> <xs:complexType> <xs:simpleContent>
<xs:restriction base="basetype"> • • • •
• • • •
</xs:restriction> </xs:simpleContent> </xs:complexType> </xs:element>
<phone country="Finland">3252353</phone>
<xs:element name-'phone"> <xs:complexType> <xs:simpleContent> <xs:extension base-'xs:integer"> <xs:attribute name-"country" type-'xs:string''/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element>
Сложные типы со смешанным
содержимым
Пример XML-элемента "letter", содержащего
текст и другие элементы:
<letter>
Dear Mr.<name>John Smith</name>. Your order <orderid>1032</orderid> will be shipped on <shipdate>2012-07-13</shipdate>. </letter>
Фрагмент XSD для элемента "letter":
<xs:element name="letter"> <xs:complexType mixed=,,true"> <xs:sequence> <xs:element name="name" type=,,xs:string7> <xs:element name=,,orderid" type=,,xs:positivelnteger"/> <xs:element name="shipdate" type="xs:date'7> </xs:sequence> </xs:complexType> </xs:element>
Для того, чтобы разрешить появление текстовых данных между дочерними элементами элемента «letter», XSD- атрибут «mixed» должен быть установлен в "true".
Индикаторы порядка:
All;
Choice;
Sequence.
Индикаторы повторений:
maxOccurs;
minOccurs.
Групповые индикаторы:
Group name;
attributeGroup name.
Индикатор All
Индикатор <all> определяет, что в XML-документы дочерние элементы могут объявляться в родительском в произвольном порядке, и что каждый дочерний элемент должен быть объявлен только один раз:
<xs:element name="person"> <xs:complexType> <xs:all>
<xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type-'xs:string7> </xs:all> </xs:complexType> </xs:element>
При использовании индикатора <all>, значение индикатора <minOccurs> может быть установлено только в 0 или 1, а значение индикатора <maxOccurs> - только в 1.
Индикатор Choice
Индикатор <choice> определяет, что в родительском элементе может присутствовать
только один из перечня дочерних элементов:
<xs:element name="person"> <xs:complexType>
<xs:choice>
<xs:element riame="employee" type="employee"/> <xs:elemerit name="student" type="student"/> </xs:choice> </xs: со m p I exTy pe > </xs:element>
Индикатор Sequence
Индикатор <sequence> определяет, что дочерние элементы должны вноситься в родительский в строго определённом порядке:
<xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element riame="firstriame" type="xs:string"/> <xs:elemerit riame="lastriame" type="xs:string'У> </xs:sequence> </xs: со m p I exTy pe > </xs:element>
Индикаторы maxOccurs и
minOccurs
Индикатор <maxOccurs> (< minOccurs >) определяет максимальное (минимальное) число вхождений дочернего элемента в родительский:
<xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element name="full_name" type-'xs:string7> <xs:element name-'child_nameM type="xs:string" max0ccurs="107> </xs:sequence> </xs:complexType> </xs:element>
PCDATA (Parsed Character Data)
Под текстовыми данными подразумевается
текст, расположенный между открывающей и закрывающей частями тега XML-элемента.
PCDATA - это текст, который БУДЕТ обработан парсером. Парсер проверяет наличие в тексте сущностей и вложенных тегов разметки.
Теги внутри текста будут интерпритированы, а сущности будут заменены на соответствующий им текст.
PCDATA не может содержать символы &, <, или >, которые должны быть представлены в виде сущностей & < arid > соответственно.
Неограниченное вхождение
элемента
Для всех индикаторов, определяющих порядок и группировку элементов (any, all, choice, sequence, group name, attributeGroup name и group reference) значение индикаторов maxOccurs и minOccurs no уомлчанию 1.
Чтобы разрешить элементу встречать неограниченное количество раз используется опция maxOccurs-'unbounded":
family.xml Пример family.xsd
<?xml version="1.0" encoding="ISO-8859-1"?> <persons
xm Iris: xsi=" http://www.w3. org/2001/XMLSchema- instance"
xsi:noNamespaceSchemaLocation="family.xsd"> <person>
<full_name>Hege Refsnes</full_name> <child_name>Cecilie</child_name> </person>
<person>
<full_name>Tove Refsnes</full_name> <child_name>Hege</child_name> <child_name>Stale</child_riame> <child_name>Jim</child_name> <child_name>Borge</child_name> </person>
<person>
<full_name>Stale Refsnes</full_name> </person>
</persons>
<?xml version="1.0" encoding="ISO-8859-1"?> <xs:schema
xm I ns: xs="http ://www ,w3.0 rg/2001/XMLSche ma" elementFormDefault-'qualified">
<xs:element name-"persons'^ <xs:complexType> <xs:sequence> <xs:element name-"person"
maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name-Tull_name" type="xs:string7> <xs:element name-'child_name" type-'xs: string" minOccurs-'0" maxOccurs-'57> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element>
Группы элементов
Индикатор элементов all, choice, или sequence могут использоваться внутри декларации групп элементов.
Example :
<xs:group name="persongroup"> <xs:sequence> <xs:element name-'firstname"type="xs:string"/> <xs:element name="lastname" type="xs:string"/> <xs:element name="birthday" type="xs:date"/> </xs:sequence> </xs:group>
Ссылка на группу элементов
<xs:element name="person" type-'personinfo"/>
<xs:complexType name-'personinfo"> <xs:sequence> <xs:group ref="persongroup'7> <xs:element name="country" type="xs:string'7> </xs:sequence> </xs:complexType>
Группы атрибутов
<xs:attributeGroup name="persoriattrgroup"> <xs:attribute name-'firstname"type="xs:string"/> <xs:attribute riame="lastriame" type="xs:string"/> <xs:attribute name-'birthday"type="xs:date"/> </xs: att r i b uteG ro u p >
<xs:elemerit name="person"> <xs:complexType>
<xs:attributeGroup ref="personattrgroup"/> </xs: со m p I exTy pe > </xs:element>
Элемент <any>
Элемент <апу> позволяет расширять XML-элемент элементами, которые не определены в XSD.
<xs:element name="person"> <xs:complexType> <xs:sequence>
<xs:element name="firstname" type="xs:string"/> <xs:element name-'lastname" type="xs:string7> <xs:any min0ccurs="07> </xs:sequence> </xs:complexType> </xs:element>
Элемент <anyAttribute>
Элемент <anyAttribute> позволяет расширять XML- элемент атрибутами, которые не определены в XSD.
<xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:sequence> <xs:anyAttribute/> </xs:complexType> </xs:element>
order.xml Последний пример ordered
<?xml version-' 1.0" encoding-'ISO-8359-1 "?>
<shiporder orderid-'SS9923" xmlns:xsi="http://www ,w3. org/2001/XMLSchema -instance"
xsi:noNamespaceSchemaLocation="order.xsd"> <orderperson>John Smith</orderperson> <shipto> <name>Nordmann</name> <address>Langgt 23</address> <city>4000 Stavanger</city> < с о u ntr у > N о rway </с о u ntry > </shipto> <item> <title>Empire</title> <note>Special Edition</note> <qua ntity> 1 </q uantity> <price>10.90</price> </item> <item>
<title>Hide your heart</title> <qua ntity> 1 </q uantity> <price>9.90</price> </item> </shiporder>
<?xml version-' 1.0" encoding-'ISO-SS59-1" ?> <xs:schema
xmlns:xs="http://vwvw.w3 .org/2 001 /XMLSch ema">
<!-- definition of simple elements ->
<xs:element name-'orderperson" type="xs: string "/>
<xs: element name-'name" type-'xs:string"/>
<xs:element name-'address" type-'xs:string"/>
<xs:element name-'city" type-'xs:string"/>
<xs: element name-'country" type="xs: string "/>
<xs:element name-'title" type-'xs:string"/>
<xs: element name-'note" type="xs: string "/>
<xs: element name-'quantity" type-'xs: positive I nteger"/>
<xs:element name-'price" type-'xs:decimal"/>
<!-- definition of attributes ->
<xs:attribute name-'order id" type-'xs:string"/>
<!-- definition of complex elements --> <xs:element name-'shipto"> <xs:complexType> <xs:sequence> <xs:element ref-'name"/> <xs:element ref-'address"/> <xs:element ref-'city"/> <xs:element ref-'country "/> </xs:sequence> </xs:complexType>
Последний пример (часть 2)
<?xml version-' 1.0" encoding-'ISO-8S59-1 "?>
<shiporder orderid="889923" xmlns:xsi="http://www ,w3. org/2001/ХМ LSchema -instance"
xsi:noNamespaceSchemaLocation-,order.xsd"> <orderperson>John Smith</orderperson> <shipto> <name>Nordmann</name> <address>Langgt 23</address> <city>4000 Stavanger</city> < с о u ntr у > N о rway </с о u ntry > </shipto> <item> <title>Empire</title> <note>Special Edition</note> <qua ntity> 1 </q uantity> <price>10.90</price> </item> <item>
<title>Hide your heart</title> <qua ntity> 1 </q uantity> <price>9.90</price> </item> </shiporder>
<xs:element name="item"> <xs:complexType> <xs:sequence> <xs: element ref-'title "/> <xs:element ref-'note" min0ccurs-'07> <xs: element ref-'quantity"/> <xs:element ref-'price"/> </xs:sequence> </xs:cornplexType> </xs:element>
<xs:element name-'shiporder"> <xs:complexType> <xs:sequence> <xs:element ref-'orderperson'7> <xs:element ref-'shipto'7> <xs:element ref-"item"
maxOccurs-'unbounded7>
</xs:sequence>
<xs:attribute ref-'orderid" use-'required'7> </xs:complexType> </xs:element>
</xs:schema>
С DATA (Character Data)
С DATA - это текст, который НЕ БУДЕТ обработан парсером.
Теги внутри текста НЕ БУДУТ интерпретированы как разметка, и сущности НЕ БУДУТ заменены на соответствующий им текст.
Секция CDATA в XML начинается символами "<![CDATA[" и заканчивается
DTD и XSD позволяют определить
элементы и атрибуты, которые могут использоваться в документе;
иерархические связи элементов (какие элементы являются дочерними, какие родительскими);
порядок расположения дочерних элементов в родительском;
количество дочерних элементов;
являются ли элементы пустыми или могут содержать текст;
типы данных элементов и атрибутов (только XSD);
значения по умолчанию и фиксированные значения (default arid fixed values) элементов и атрибутов.
В XML DTD может быть объявлено как непосредственно внутри XML-документа, так и в виде ссылки на внешний документ.
Декларация DTD внутри XML
Если DTD объявляется непосредственно внутри XML-файла, для правил DTD используется следующий синтаксис-обертка DOCTYPE:
<!DOCTYPE root-element [element-declarations]>
Пример XML-документа с внутренним DTD ("note.xml")
<?xml version-"!.0"?> <! DOCTYPE note [
<! ELEMENT note (to, from .heading, body) > <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>
]>
<note>
<to>Receiver</to> <from>Sender</from> <heading>Theme</heading> <body>Some text</body> </note>
Использование внешнего DTD
Если DTD объявляется во внешнем по отношению к XML файле, для ссылки на него используется следующий синтаксис:
<!DOCTYPE root-element SYSTEM "filename">
Пример ("note.xml")
<?xml version="1.0"?> <!DOCTYPE note SYSTEM "note.dtd"> <note> <to> Recei ver</to> <from>Sender</from> <heading>Theme</heading> <body>Some text</body> </note>
<!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>
Объявление элементов в DTD
<!ELEMENT element-name category> или
<!ELEMENT element-name (element-content)> где
category - тип содержимого элемента;
element-content - перечень имен дочерних элементов по отношению к текущему.
Пустые элементы
Пустые элементы объявляются путем указания ключевого слова EMPTY в качестве тип содержимого элемента:
<!ELEMENT element-name EMPTY>
Пример DTD: <!ELEMENT br EMPTY>
Пример XML:
<br />
Элементы с PCDATA
Элементы с обрабатываемыми текстовыми данными объявляются путем указания типа # PC DATA :
<!ELEMENT element-name (#PCDATA)> Пример:
<!ELEMENT from (#PCDATA)>
Указание типа #CDATA для элемента недопустимо.
Элементы с любым содержимым
Элементы, объявленные с типом содержимого ANY, могут содержать любую комбинацию данных, которые могут быть обработаны парсером (без спецсимоволов):
<!ELEMENT elemerit-riame ANY> Пример:
<!ELEMENT note ANY>
Элемент note может иметь или не иметь дочерние элементы в любом порядке с любым количеством вхождений, иметь или не иметь чередующиеся символьные данные.
Элементы с дочерними элементами (последовательности)
При объявлении элементов, которые содержат один или несколько дочерних элементов внутри скобок указывается перечень имен элементов- потомков:
<!ELEMENT elemerit-riame (child1)> или
<!ELEMENT elemerit-riame (child1Jchild2)...)> Пример:
<!ELEMENT note (to,from,heading,body)>
Полный пример
Когда дочерние элементы, разделенные запятыми, указываются в списке, это означает, что они должны появляться в документе в том
же самом порядке.
Полная декларация элемента подразумевает,
что все дочерние элементы также должны быть объявлены и в свою очередь также могут иметь дочерние элементы.
Полная декларация элемента "note" имеет вид:
<!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>
<!ELEMENT element-name (child-name)> Пример:
<!ELEMENT note (message)>
Приведенный пример декларирует, что дочерний элемент "message" должен встречаться один и только один раз внутри элемента "note".
<!ELEMENT element-name (child-name+)> Пример:
<!ELEMENT note (message+)>
Знак + в примере декларирует, что дочерний элемнет "message" должен встречаться один или более раз внутри элемента "note".
Объявление нуля или многих вхождений элемента
<!ELEMENT element-name (child-name*)> Пример:
<!ELEMENT note (message*)>
Символ * в примере декларирует, что дочерний элемент "message" может встречаться ноль, один или много раз внутри элемента "note".
<!ELEMENT element-name (child-name?)> Пример:
<!ELEMENT note (message?)>
Знак ? в примере декларирует, что дочерний элемент "message" может встречаться ноль или один раз внутри элемента "note".
Объявление содержимого
«или/или»
Пример:
<!ELEMENT note
(to,from, header, (message | body))>
В примере декларируется, что элемент "note" должен содержать 4 элемента: элементы "to", "from", "header", и один элемент или "message" или "body".
Пример:
<!ELEMENT note
(#PCDATA|to |from | header] message)*>
В примере декларируется, что элемент "note" может содержать ноль, один или много вхождений обрабатываемых текстовых данных, элементов, "to", "from", "header" или "message", размещенных в произвольном порядке.
Объявление атрибутов в DTD
Декларация атрибута имеет следующий
синтаксис:
<!ATTLIST element-name attribute-name attribute- type default-value>
Пример DTD:
Тип |
Описание |
С DATA |
Значение является текстовыми данными |
(еп1\еп2\..) |
Значением должен быть один из элементов приведенного списка |
ENTITY |
Значением является сущность |
<!ATTLIST payment type С DATA Mcheck"> Пример XML: < payment type-'check" />
Значение |
Описание |
value |
Непосредственно значение атрибута по умолчанию |
#REQUIRED |
Атрибут является обязательным |
#IMPLIED |
Атрибут не является обязательным |
#FIXED value |
Значение атрибута фиксировано |
Значение атрибута по умолчанию (Value)
DTD:
«ELEMENT square EMPTY> <!ATTLIST square width С DATA "0">
Валидный XML: <square width=M100M/>
В примере элемент "square" определён как пустой элемент с атрибутом "width", имеющим тип данных CDATA. Если атрибут "width" не указан, он имеет значение по умолчанию, равное 0.
#REQUIRED
Синтаксис
<!ATTLIST element-name attribute-name attribute-type #REQUIRED>
Пример
DTD:
<!ATTLIST person number С DATA #REQUIRED>
Валидный XML: <person number="5677" />
Невалидный XML: <person />
Ключевое слово #REQUIRED используется, если значения по умолчанию задать не удаётся, но требуется обеспечить обязательное наличие атрибута.
#IMPLIED
Синтаксис
<!ATTLIST element-name attribute-name attribute-type #IMPLIED>
Пример
DTD:
<!ATTLIST contact fax CDATA #IMPLIED>
Валидный XML: <contact fax="555-667788" />
Валидный XML: < contact />
Ключевое слово #IMPLIED используется, если значение по умолчанию для атрибута задать не удаётся, и его наличие в элементе не является обязательным.
#FIXED
Синтаксис
<!ATTLIST elemerit-name attribute-riame attribute-type #FIXED "value">
Пример
DTD:
dATTLIST sender company С DATA #FIXED "Microsoft"*
Валидный XML:
<sender company="Microsoft" />
Невалидный XML: <sender company="KNURE" />
Ключевое слово #FIXED используется, если атрибут должен иметь фиксированное значение, а автор XML-документа не должен иметь возможность его изменить. Если автор внесет другое значение, XML-napcep вернёт ошибку. Наличие атрибута с фиксированным значением в элементе не является обязательным, в случае его отсутствия значения подставится автоматически.
Перечисленные значения атрибутов
Синтаксис
<!ATTLIST element-name attribute-name (en1|en2|..) default-value>
Пример
DTD:
<!ATTLIST payment type (check|cash) "cash"> XML:
<payment type="check" /> или
<payment type="cash" />
Перечисление значений атрибутов используются когда требуется, чтобы атрибут мог принимать только одно из явно заданного набора допустимых значений.
DTD - Сущности
Сущностями в DTD являются переменные, которые используются для определения именованных ссылок на повторяемый текст или спецсимволы.
Ссылки на сущности заменяются соответствующим им текстом.
Сущности могут быть внутренними и внешними по отношению к документу DTD.
Объявление внутренней сущности
Синтаксис
<! ENTITY entity-name "entity-value">
Пример
DTD:
<!ENTITY writer "Donald Duck.">
<!ENTITY copyright "Copyright Donald Duck.">
XML:
<author>&writer;©right;</author>
Замечание: Ссылка на сущность состоит из трёх частей: амперсанта (&), имени сущности, и символа «точка с запятой» (;).
Объявление внешней сущности
Синтаксис
<!ENTITY entity-name SYSTEM "URI/URL">
Пример
DTD:
ENTITY writer SYSTEM "http://www. mysite.com/entities.dtd">
IENTITY copyright SYSTEM "http://www. mysite.com/entities.dtd">
XML:
author>&writer;©right;</author>
XML Schema
XML Schema это основанная на XML
альтернатива DTD.
Язык XML Schema также часто называется как XML Schema Definition (XSD) - определение XML- схемы.
XML Schema является рекомендацией W3C. Validator:
htt p ://www. w3. о rg/2001 /03/we bd ata/xs v
Xml Schema является наследником dtd
На сегодняшний день определена тенденция перехода в web-приложениях от использования DTD к применению XML Schema.
Причины данной тенденции:
XML Schema синтаксически более богата и обладает большими возможностями, чем DTD;
XML Schema создается с применением XML;
XML Schema поддерживает типы данных;
XML Schema поддерживает пространства имён;
XML Schema - это расширяемый язык, открытый для будущих дополнений.
Xml Schema использует синтаксис xml
Многие преимущества XSD связаны с тем, что она создается с применением XML:
используется один универсальный язык;
для редактирования XSD файлов может использоваться XML-редактор;
XSD файлы могут обрабатываться XML парсером, как и обычные XML-файлы;
с XSD манипулировать, используя XML DOM;
возможна трансформация XSD с использованием XSLT.
XML Schema поддерживает типы
данных
Поддержка типов данных позволяет облегчить:
описание допустимого содержимого документа;
валидацию корректности данных в документе;
работу с данными, полученными из баз данных;
определение аспектов данных (ограничений на данных - data facet);
определение шаблонов данных (data formats);
осуществлять конвертацию данных между различными типами данных.
Xml Schema является расширяемой
Расширяемая XSD позволяет:
повторно использовать разработанную схему в других схемах;
создавать собственные типы данных, наследуя их от стандартных типов;
использовать несколько XSD в одном документе.
Пример ("note.xml")
<?xml version="1.0"?> <note> <to>Receiver</to> <from>Sender</from> <heading>Theme</heading> <body>Some text</body> </note>
Внешнее DTD
<!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>
An XML Schema ("note.xsd")
<?xml version="1.0"?>
<xs:schema xm I ns:xs="http:/AAAAAA/.w3. org/2001/XMLSche ma" targetNamespace="http://www.mysite.com" xml ns="http:/A/\/ww. mysite.com" elementFormDefault="qualified">
<xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
<xs:element name="heading" type="xs:string7>
<xs:element name="body" type="xs:string7>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Ссылка на внешнее DTD
<?xml version="1.0"?> <!DOCTYPE note SYSTEM
"http://www.mysite.com/dtd/note.dtd"> <note>
<to>Receiver</to> <from>Sender</from> <heading>Theme</heading> <body>Some text</body> </note>
Ссылка на XML Schema
<?xml version-'1.0"?> <note
xmlns="http://www. mysite.com"
xmlns:xsi="http://vwvw.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://vwvw. mysite.com http://www.mysite.com/xsd/note.xsd"> <to>Receiver</to> <from>Sender</from> <heading>Theme</heading> <body>Some text</body> </note>
Фрагмент:
xmlns="http:/ArtAM^ mysite.com"
определяет пространство имен, используемое по умолчанию. Эта декларация объявляет валидатору, что все элементы, используемые в XML-документе без префикса-названия пространства имен, объявлены в пространстве имён "http://www.mysite.com".
Поскольку создается экземпляр XML Schema, доступно пространство имен:
xmlns:xsi="http://www. w3.org/2QQ1/XMLSchema-instance"
Включение данного пространства имен делает обязательной валидацию ХМL-документа.
При указании расположения XSD-документа можно использовать атрибут schemaLocation пространтства имён XMLSchema-instance.
Этот атрибут содержит пары значений, разделённые пробелами. Первое значений - это имя пространства имён. Второе значение - это URL XSD, используемого для данного прострнаства имен:
xsi:schemaLocation="http:/AAAAAA/.mvsite.com http://www.mysite.cofn/xsd/note.xsd" xsi:schemaLocation= "namespace_name uri
namespace_name url..."
XSD. Элемент <schema>
Элемент <schema> является корневым элементом любого экземпляра XML Schema:
?xml version="1.0"?>
xs:schema> ■ ■ ■
■ ■ ■
/xs:schema>
Атрибуты элемента Schema
Элемент <schema> может содержать
атрибуты.
Пример декларации XSD :
<?xml version="1.0"?> <xs:schema
xmlns:xs="http://www.w3. org/2001 /ХМ LSchema" targetNamespace="http://www. mysite.com" xm I ns="http://www. mysite.com"
elementFormDefault="qualified">
</xs:schema>
Следующий фрагмент:
xmlns:xs="http://www.w3.org/2001/^
определяет, что элементы и типы данных, используемые в схеме, принадлежат пространству имен "http://www.w3.org/2001/XMLSchema".
Он также определяет, что элементы и типы данных из пространства имен "http://www.w3.org/2001 /XMLSchema" должны использоваться с префиксом "xs:".
Следующий фрагмент:
targetNamespace="http://www. mysite.com"
что элементы, определённые в этом XSD (note, to, from, heading, body.) принадлежат пространству имен "http://www.mysite.com".
Данный фрагмент:
xmlns="http://www.mysite.com"
определяет, что пространством имен по умолчанию является "http://www.mysite.com".
Данный фрагмент:
elementFormDefault-'qualified"
что любой элемент, указанный в данном XSD при использовании в экземпляре XML- документа должен содержать префикс пространства имен.
Простые элементы (Simple Elements)
Простым элементом является XML-элемент, который может содержать только текст. Такой элемент не может содержать другие элементы или атрибуты.
Текст может принадлежать к нескольким различным типам данных. Это может быть как один из типов данных, включенных в XSD
(boolean, string, date и т.д.), так и пользовательский тип данных.
К типам данных также можно добавлять ограничения с целью ограничить допустимое содержимое, или обеспечения соответствия данных определённому шаблону.
Декларация простого элемента
Синтаксис
< xs:element name-'xxx" type="yyy"/> где xxx- это имя элемента; ууу - это тип данных элемента.
XML Schema имеет набор предопределённых типов данных. Например:
xs: string
xs:decimal
xs: integer
xs: boolean
xs:date
xs:time
XML-элементы:
lastname>Refsnes</lastname>
age>36</age>
dateborri>1970-03-27</dateborri>
XSD-декларация соответствующих простых элементов:
xs:element name-'lastname" type-'xs:string'У>
xs:element name="age" type="xs:integer"/>
xs:element name-'dateborn" type="xs:date"/>
Значения по умолчанию и фиксированные значения простых элементов
• Значение по умолчанию автоматически присваивается элементу в случае, если для него не было указано никакое другое значение.
< xs:element name-'color" type="xs:string"
default="red"/>
• Фиксированное значение элемента не может быть изменено, хотя элемент и может быть пустым, тогда фиксированное значение подставляется автоматически.
< xs:element name-'color" type="xs:string"
fixed="red"/>
Атрибуты XSD
Простые элементы не могут иметь атрибуты. Если элемент содержит атрибуты, то ему присвоен (сложный тип данных complex type).
Но сам по себе атрибут всегда объявляется как простой тип.
Декларация атрибута
Синтаксис
<xs:attribute name="xxx" type="yyy"/> где ххх- это имя атрибута; ууу - это тип данных атрибута.
Для атрибутов также как и для элементов могут задаваться предопределённые в XML Schema типы данных:
xs:string
xs:decimal
xs: integer
xs: boolean
xs:date
xs:time
XML-элемент с атрибутом: <lastname lang="EN">Smith</lastname>
Соответствующая декларация атрибута в XSD:
<xs:attribute name-'lang" type="xs:string"/>
Значения по умолчанию и фиксированные значения атрибутов
• Значение по умолчанию автоматически присваивается атрибуту в случае, если для него не было указано никакое другое значение.
<xs:attribute name-'lang"type="xs:string"
default="EN"/>
• Фиксированное значение атрибута не может быть изменено, хотя атрибут и может быть пустым, тогда фиксированное значение подставляется автоматически.
<xs:attribute name-'lang"type="xs:string'
fixed="EN"/>
Опциональные и обязательные
атрибуты
По умолчанию атрибуты являются опциональными. Для указания того, что XML-атрибут является обязательным, используется XSD-атрибут "use":
<xs:attribute name-'lang" type="xs:string"
use="required"/>
Ограничения содержимого
Когда XML-элементу или атрибуту назначается тип данных, это задает ограничения на содержимое элемента или атрибута.
Например, если XML-элемент имеет тип данных "xs:date" и содержит строку "Hello World", такой элемент валидацию не пройдет.
XML Schema, позволяет разрабатывать собственные ограничения для XML- элементов и атрибутов. Эти ограничения называются аспекты данных (facets).