150 likes | 365 Views
DTD vs. XML Schema. Недостатки DTD:. Для документа можно задать только одно DTD. DTD описывается на языке, отличном от XML. DTD не использует типы данных. Эти проблемы решает XML Schema:. Задает структуру XML- документа. Использование нескольких схем в одном документе.
E N D
DTD vs. XML Schema Недостатки DTD: • Для документа можно задать только одно DTD • DTD описывается на языке, отличном от XML • DTD не использует типы данных Эти проблемы решает XML Schema: • Задает структуру XML-документа • Использование нескольких схем в одном документе • Задание типа данных для элементов и атрибутов
XML Schema – простейший вариант • XML Schema содержит: 1. описание типов элементов 2. описание возможных корневых элементов документа <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="forecast" type="xsd:string"> </xsd:element> </xsd:schema> Описание корневых элементов документа Тип содержимого элемента Имя элемента • Встроенные типы: xsd:string, xsd:integer, xsd:positiveInteger, xsd:negativeInteger, xsd:date, xsd:type и т.д. • Пример: cм. forecast-simplest
Для описания элементов со сложной моделью содержания требуются сложные типы Определения сложных типов • Определение сложного типа <xsd:complexType name=“ForecastType”> <xsd:sequence> <xsd:element name = “date” type = “xsd:date”/> <xsd:element name = “location” type = “LocationType” minOccurs = “1” maxOccurs = “unbounded”/> </xsd:sequence> </xsd:complexType> <xsd:complexType name=“LocationType”> <xsd:sequence> <xsd:element name=“name” type=“xs:string”/> </xsd:sequence> </xsd:complexType> • Пример: cм. forecast-1
Иногда именованный тип можно не вводить Встроенные определения типов <xsd:element name="forecast"> <xsd:complexType> <xsd:sequence> <xsd:element name = "date" type = "xsd:date"/> <xsd:element name = "location" minOccurs = "1" maxOccurs = "unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name="name" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> Встроенное определение типа • Пример: cм. forecast-2
Внутри сложного типа могут быть элементы sequence, choice или all Определения модели содержания для сложных типов <xsd:complexType name=“ForecastType”> <xsd:sequenceminOccurs=“…” maxOccurs=“…”> <xsd:element name = “date”…/> <xsd:element name = “location”…/> </xsd:sequence> </xsd:complexType> Все перечисленные здесь элементы в таком же порядке <xsd:complexType name=“ForecastType”> <xsd:choice minOccurs=“…” maxOccurs=“…”> <xsd:element name = “date”…/> <xsd:element name = “location”…/> </xsd:choice> </xsd:complexType> Один из перечисленных здесь элементов <xsd:complexType name=“ForecastType”> <xsd:all minOccurs=“…” maxOccurs=“…”> <xsd:element name = “date”…/> <xsd:element name = “location”…/> </xsd:all> </xsd:complexType> Один или несколько перечисленных здесь элементов в любом порядке
Сложные типы также могут содержать атрибуты Сложные типы и атрибуты <xsd:complexType name=“ForecastType”> <xsd:sequence> <xsd:element name = “location” type = “LocationType” minOccurs = “1” maxOccurs = “unbounded”/> </xsd:sequence> <xsd:attribute name=“date” type=“xs:date” use=“optional”/> </xsd:complexType> <xsd:complexType name=“LocationType”> <xsd:attribute name=“name” type=“xsd:string” use=“required”/> </xsd:complexType> • Атрибуты могут иметь только простой тип • Пример: cм. forecast-3
Новые простые типы строятся на основе существующих Простые типы • Ограничение диапазона значений <xsd:simpleType name=“TemperatureType"> <xsd:restriction base="xsd:int"> <xsd:minInclusive value="-50"/> <xsd:maxInclusive value="50"/> </xsd:restriction> </xsd:simpleType> Ограничение типа xsd:int • Ограничение-перечисление <xsd:simpleType name=“ConditionsType"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="Sunny"/> <xsd:enumeration value=“Cloudy"/> </xsd:restriction> </xsd:simpleType> • Пример: cм. forecast-4, forecast-5
Задают допустимые текстовые строки. Регулярные выражения применимы почти ко всем простым типам. Простые типы: регулярные выражения <xsd:simpleType name=“LocationCode"> <xsd:restriction base="xsd:string"> <xsd:pattern value=“[a-z,A-Z][a-z,A-Z,0-9]+"/> <xsd:enumeration value=“Cloudy"/> </xsd:restriction> </xsd:simpleType> Регулярное выражение Выражение Соответствующие строки a*x x, ax, aax, aaax .... a?x ax, x a+x ax, aax, aaax .... (a|b)+x ax, bx, aax, abx, bax, bbx, aaax, aabx, abax, abbx, … [abcde]x, [a-e]x ax, bx, cx, dx, ex [^0-9]x Отличный от цифры символ, затем x ab{2}x abbx ab{2,4}x abbx, abbbx, abbbbx (ab){2,}x ababx, abababx, ababababx, abababababababx, … • Пример: cм. forecast-6
Сложные типы: наследование от простых типов • Можно дополнить любой простой тип произвольным количеством атрибутов <xsd:complexType name=“TemperatureType"> <xsd:simpleContent> <xsd:extension base=“xsd:int”> <xsd:attribute name=“scale” type=“xsd:string” use=“required”/> </xsd:extension> </xsd:simpleContent> </xsd:simpleType> • Пример типа температуры с указанием шкалы измерения … <location name=“Moscow”> <temperature scale=“C”>10<temperature> </location> … • Пример: cм. forecast-7
Сложные типы: наследование от сложных типов • Можно дополнить любой сложный тип произвольным количеством атрибутов и элементов <xsd:complexType name="LocationType"> … </xsd:complexType> <xsd:complexType name="LocationWithWindType"> <xsd:complexContent> <xsd:extension base="LocationType"> <xsd:sequence> <xsd:element name="wind" type="xsd:int"/> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> • Пример: cм. forecast-8, forecast-9
Ccылки на материалы по XML Schema http://lucas.ucs.ed.ac.uk/xml-schema: введение в XML Schema http://www.w3.org/XML/Schema: cамая полная информация и список ссылок http://www.w3.org/TR/xmlschema-0: неформальное, зато читабельное описание
XML схема <-> класс C# • Преобразование cхемы в класс C# xsd.exe /classes /language:cs geometry.xsd XmlSerializer s = new XmlSerializer(typeof(geometry)); … geometry g = (geometry)s.Deserialize(reader); foreach(object o in g.Items) if(o is Triangle) { … } else if(o is Circle) { … } … • Преобразование класса C# в XML-схему xsd.exe /dataset geometry.dll
Основные правила работы с автоматически созданными классами • Группа choice превращается в массив object[] <xs:element name="geometry"> <xs:complexType> <xs:sequence maxOccurs="unbounded"> <xs:choice> <xs:element name="triangle" type="Triangle" /> <xs:element name="circle" type="Circle" /> </xs:choice> </xs:sequence> </xs:complexType> </xs:element> public class geometry { … public object[] Items; }
Основные правила работы с автоматически созданными классами. Продолжение. • Если атрибут или элемент необязателен, то дополнительно создается соответствующее поле данных логического типа. <xsd:complexType name="ForecastType"> … <xsd:attribute name="date" type="xsd:date" use="optional"/> </xsd:complexType> public class ForecastType { … public System.DateTime date; … public bool dateSpecified; }
XML Serializer • Класс XmlSerializer позволяет работать с документами XML, отражающими структуру графа объектов. DataObject obj; … XmlSerializer serializer = new XmlSerializer(typeof(DataObject)); … serializer.Serialize(stream, root); … obj = (DataObject)serializer.Deserialize(stream); … stream.Close(); • В графе объектов не может быть циклов! • Структуру XML-документа можно задавать при помощи атрибутов using System.Xml.Serialization; public class DataObject { public DataObject first; public DataObject second; [XmlAttribute] public int value; public string name; … }