1 / 15

DTD vs. XML Schema

DTD vs. XML Schema. Недостатки DTD:. Для документа можно задать только одно DTD. DTD описывается на языке, отличном от XML. DTD не использует типы данных. Эти проблемы решает XML Schema:. Задает структуру XML- документа. Использование нескольких схем в одном документе.

gus
Download Presentation

DTD vs. XML Schema

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. DTD vs. XML Schema Недостатки DTD: • Для документа можно задать только одно DTD • DTD описывается на языке, отличном от XML • DTD не использует типы данных Эти проблемы решает XML Schema: • Задает структуру XML-документа • Использование нескольких схем в одном документе • Задание типа данных для элементов и атрибутов

  2. 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

  3. Для описания элементов со сложной моделью содержания требуются сложные типы Определения сложных типов • Определение сложного типа <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

  4. Иногда именованный тип можно не вводить Встроенные определения типов <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

  5. Внутри сложного типа могут быть элементы 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> Один или несколько перечисленных здесь элементов в любом порядке

  6. Сложные типы также могут содержать атрибуты Сложные типы и атрибуты <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

  7. Новые простые типы строятся на основе существующих Простые типы • Ограничение диапазона значений <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

  8. Задают допустимые текстовые строки. Регулярные выражения применимы почти ко всем простым типам. Простые типы: регулярные выражения <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

  9. Сложные типы: наследование от простых типов • Можно дополнить любой простой тип произвольным количеством атрибутов <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

  10. Сложные типы: наследование от сложных типов • Можно дополнить любой сложный тип произвольным количеством атрибутов и элементов <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

  11. 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: неформальное, зато читабельное описание

  12. 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

  13. Основные правила работы с автоматически созданными классами • Группа 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; }

  14. Основные правила работы с автоматически созданными классами. Продолжение. • Если атрибут или элемент необязателен, то дополнительно создается соответствующее поле данных логического типа. <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; }

  15. 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; … }

More Related