XML extensible Markup Language część 2
Definicja Typu Dokumentu - DTD Jeżeli dokument XML jest zgodny z określonym dla niego DTD mówimy wówczas że jest poprawny strukturalnie (w skrócie poprawny valid). - ang. Poprawność strukturalna dokumentu XML nie jest wymagana (zależy to np. od twórcy dokumentu). Wymagane jest aby dokument był poprawny składniowo. Jeżeli jednak dokument nie będzie poprawny aplikacja działająca w oparciu o dane w nim zapisane może nie działać poprawnie. UWAGA: Przyjęte jest, że w dokumencie XML zakazane jest wszystko co nie jest dozwolone przez związany z nim dokument DTD.
XML Schema (Podobnie jak DTD) XML Schema to opracowany przez W3C standard służący do definiowania struktury dokumentu XML. (W przeciwieństwie do DTD) XML Schema jest aplikacją XML. XML pozwala (dokładniej niż DTD) określić strukturę dokumentów XML. XML schema oferuje większą niż DTD ilość typów (elementów, atrybutów, danych). W XML schema możemy definiować własne typy wykorzystując typy wbudowane. Dokumenty zawierające definicje XML Schema zapisuje się zwykle w plikach z rozszerzeniem xsd.
XML Schema W DTD nie możemy zapisać, że zawartością pewnego elementu jest data. W konsekwencji ciąg znaków 2016-11-03 może być zrozumiany na dwa sposoby (rożne zapisy w różnych krajach): 3 listopada 11 marca Jeżeli jednak data jest zawartością elementu np.: <date type="date">2016-11-03</date> wówczas możemy w odpowiednim schemacie XML opisać zawartość elementu date jako "YYYY-MM-DD".
XML Schema Rozpatrzmy następujący dokument XML: <?xml version="1.0"?> <note> <to>tove</to> <from>jani</from> <heading>reminder</heading> <body>don't forget me this weekend!</body> </note> DTD (note.dtd): <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>
XML Schema XML schema (note.xsd): <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/xmlschema" targetnamespace="http://www.w3schools.com" xmlns="http://www.w3schools.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:string"/> <xs:element name="body" type="xs:string"/> </xs:sequence> </xs:complextype> </xs:element> </xs:schema>
XML Schema Struktura dokumentu XML schema: <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/xmlschema">.................. </xs:schema> Do przestrzeni nazw xs należą wszystkie elementy i typy, które będziemy używali w XML schema.
XML Schema Odwołanie do DTD: <?xml version="1.0"?> <!DOCTYPE note SYSTEM "http://www.w3schools.com/xml/note.dtd"> <note> <to>tove</to> <from>jani</from> <heading>reminder</heading> <body>don't forget me this weekend!</body> </note>
XML Schema Struktura dokumentu XML schema <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/xmlschema" targetnamespace="http://www.abc.org" xmlns="http://www.abc.org" elementformdefault="qualified">... </xs:schema> Określenie przestrzeni nazw do której należą elementy (note, to, from ) definiowane w danym schemacie XML: targetnamespace="http://www.abc.org" Każdy element zdefiniowany w tym schemacie XML i użyty w dokumencie XML musi być przypisany do tej przestrzeni nazw: elementformdefault="qualified"
XML Schema Odwołanie do dokumentu XML schema <?xml version="1.0"?> <note xmlns="http://www.abc.org" xmlns:xsi="http://www.a1.com/2012/xmlschema-instance" xsi:schemalocation="http://www.abc.org/note.xsd"> <to>tove</to> <from>jani</from> <heading>reminder</heading> <body>don't forget me this weekend!</body> </note> Określenie przestrzeni nazw: xmlns:xsi="http://www.a1.com/2012/xmlschema-instance" Określenie położenia schematu XML związanego z (powyższą) przestrzenią nazw: xsi:schemalocation="http://www.abc.org/note.xsd"
XML Schema deklaracje elementów i atrybutów Elementy proste Każdy element prosty dokumentu XML deklarujemy w następujący sposób: <xs:element name="nazwa" type="typ elementu"> Przykład 1 Deklaracje elementów: <xs:element name="lastname" type="xs:string"/> <xs:element name="age" type="xs:integer"/> <xs:element name="dateborn" type="xs:date"/> Przykładowe użycie: <lastname>nowak</lastname> <age>36</age> <dateborn>1970-03-27</dateborn>
XML Schema deklaracje elementów i atrybutów Oprócz atrybutu type każda deklaracja elementu prostego może posiadać nastepujące atrybuty: default="x" - gdzie x jest wartością domyślną elementu Przykład 2 <xs:element name="color" type="xs:string" default="red"/> fixed="x" - gdzie x jest wartością elementu której nie można zmienić Przykład 3 <xs:element name="color" type="xs:string" fixed="red"/>
XML Schema deklaracje elementów i atrybutów Atrybuty Atrybuty elementu XML deklarujemy w następujący sposób: <xs:attribute name="nazwa" type="typ atrybutu"> Przykład 4 Atrybut: <lastname lang="en">smith</lastname> i jego definicja: <xs:attribute name="lang" type="xs:string"/>
XML Schema deklaracje elementów i atrybutów Oprócz atrybutu type każda deklaracja atrybutu może posiadać nastepujące atrybuty: default="x" - gdzie x jest wartością domyślną atrybutu Przykład 5 <xs:attribute name="lang" type="xs:string" default="en"/> fixed="x" - gdzie x jest wartością elementu której nie można zmienić Przykład 6 <xs:attribute name="lang" type="xs:string" fixed="en"/>
XML Schema deklaracje elementów i atrybutów Atrybuty elementów są domyślnie opcjonalne. Można to zmienić za pomocą atrybutu: use="required" Przykład 7 <xs:attribute name="lang" type="xs:string" use="required"/>
XML Schema deklaracje elementów i atrybutów Oprócz atrybutu type każdy element może posiadać nastepujące atrybuty: minoccurs="x" - określa minimalną liczbę wystapień elementu. maxoccurs="x" - określa maksymalną liczbę wystapień elementu (nieograniczona unbounded) W przypadku braku tych atrybutów wartość x ma domyślną wartość 1. Przykład 8 <xs:element name="email"> <xs:element name="head" minoccurs="1" maxoccurs="1"> <xs:element name="to" maxoccurs="unbounded">
XML Schema typy wbudowane Typy numeryczne Przykłady xs:byte - liczba całkowita z przedziału -128 127 xs:double - 03.1415292, 6.022E23, 127E-13 xs:float 3.1415292, -03.1415292, 6.022E23, 127E-13 xs:integer - 3, 3000, 349847329847983264983264987326487326487324678346374 Typ logiczny xs:boolean - true, false, 0, 1
XML Schema typy wbudowane Typy znakowe Przykłady xs:string xs:ncname dowolna nazwa XML xs:id nazwa XML niepowtarzalna w całym dokumencie XML xs:idref xs:language kody języków zdefiniowane w ISO 639 np. en, en-us, en-gb, fr-ca
XML Schema typy wbudowane Typy zwiazane z datą i czasem Przykłady xs:time czas w formacie ±hh:mm:ss.xxx (xxx ułamki sekund). Dodatkowa litera Z oznacza czas Greenwich. 03:32:00-05:00 00:00:00Z 08:30:34.121893632178 xs:date data w formacie YYYY-MM-DD±hh:mm 2001-01-01 2002-12-23+12:00-8750-01-01
XML Schema typy proste Typy proste (simple data types) definiowane przez ograniczenie typów wbudowanych. Przykład 9 <xs:simpletype name="dayofmonth"> <xs:restriction base="xs:integer"> <xs:mininclusive value="1"/> <xs:maxinclusive value="31"/> </xs:restriction> </xs:simpletype> Przykład 10 <xs:simpletype name="namestring"> <xs:restriction base="xs:string"> <xs:maxlength value="50"/> </xs:restriction> </xs:simpletype>
XML Schema typy proste Przykład 11 <xs:simpletype name="locationtype"> <xs:restriction base="xs:string"> <xs:enumeration value="work"/> <xs:enumeration value="home"/> <xs:enumeration value="mobile"/> </xs:restriction> </xs:simpletype>
XML Schema typy proste Deklarowanie elementów w oparciu o typy proste. Przykład 12 <xs:element name="car"> <xs:simpletype> <xs:restriction base="xs:string"> <xs:enumeration value="audi"/> <xs:enumeration value="golf"/> <xs:enumeration value="bmw"/> </xs:restriction> </xs:simpletype> </xs:element> gdzie każdy element enumeration określa dopuszczalną wartości.
XML Schema typy proste Możliwe jest rozdzielenie definicji elementu i jego typu: Przykład 13 <xs:element name="car" type="cartype"/>... <xs:simpletype name="cartype"> <xs:restriction base="xs:string"> <xs:enumeration value="audi"/> <xs:enumeration value="golf"/> <xs:enumeration value="bmw"/> </xs:restriction> </xs:simpletype>
XML Schema typy proste Ograniczenie wartości w oparciu o wzorzec. Przykład 14 Wartością może być jedna mała litera z zakresu a-z. <xs:element name="letter"> <xs:simpletype> <xs:restriction base="xs:string"> <xs:pattern value="[a-z]"/> </xs:restriction> </xs:simpletype> </xs:element>
XML Schema typy proste Ograniczenie wartości w oparciu o wzorzec. Przykład 15 Wartością są trzy WIELKIE litery z zakresu a-z. <xs:element name="initials"> <xs:simpletype> <xs:restriction base="xs:string"> <xs:pattern value="[a-z][a-z][a-z]"/> </xs:restriction> </xs:simpletype> </xs:element>
XML Schema typy proste Ograniczenie wartości w oparciu o wzorzec. Przykład 16 Wartością są trzy małe bądź WIELKIE litery z zakresu a-z. <xs:element name="initials"> <xs:simpletype> <xs:restriction base="xs:string"> <xs:pattern value="[a-za-z][a-za-z][a-za-z]"/> </xs:restriction> </xs:simpletype> </xs:element>
XML Schema typy proste Ograniczenie wartości w oparciu o wzorzec. Przykład 17 Wartością jest jedna z liter x, y, z. <xs:element name="choice"> <xs:simpletype> <xs:restriction base="xs:string"> <xs:pattern value="[xyz]"/> </xs:restriction> </xs:simpletype> </xs:element>
XML Schema typy proste Ograniczenie wartości w oparciu o wzorzec. Przykład 18 Wartością jest pięć cyfr z przedziału 0-9. <xs:element name="prodid"> <xs:simpletype> <xs:restriction base="xs:integer"> <xs:pattern value="[0-9][0-9][0-9][0-9][0-9]"/> </xs:restriction> </xs:simpletype> </xs:element>
XML Schema typy proste Ograniczenie wartości w oparciu o wzorzec. Przykład 19 Wartością jest zero bądź więcej małych liter z zakresu a-z. <xs:element name="letter"> <xs:simpletype> <xs:restriction base="xs:string"> <xs:pattern value="([a-z])*"/> </xs:restriction> </xs:simpletype> </xs:element>
XML Schema typy proste Ograniczenie wartości w oparciu o wzorzec. Przykład 20 Wartością jest przynajmniej jedna para liter: mała z zakresu a-z, WIELKA z zakresu A-Z. <xs:element name="letter"> <xs:simpletype> <xs:restriction base="xs:string"> <xs:pattern value="([a-z][a-z])+"/> </xs:restriction> </xs:simpletype> </xs:element>
XML Schema typy proste Ograniczenie wartości w oparciu o wzorzec. Przykład 21 Wartością jest male lub female. <xs:element name="gender"> <xs:simpletype> <xs:restriction base="xs:string"> <xs:pattern value="male female"/> </xs:restriction> </xs:simpletype> </xs:element>
XML Schema typy proste Ograniczenie wartości w oparciu o wzorzec. Przykład 22 Wartością jest osiem znaków (małych lub WIELKICH liter lub cyfry 0-9). <xs:element name="password"> <xs:simpletype> <xs:restriction base="xs:string"> <xs:pattern value="[a-za-z0-9]{8}"/> </xs:restriction> </xs:simpletype> </xs:element>
XML Schema typy proste Ograniczenie wartości w oparciu o długość. Przykład 23 Wartością jest osiem dowolnych znaków. <xs:element name="password"> <xs:simpletype> <xs:restriction base="xs:string"> <xs:length value="8"/> </xs:restriction> </xs:simpletype> </xs:element>
XML Schema typy proste Ograniczenie wartości w oparciu o długość. Przykład 24 Wartością jest minimum pięć i maksymalnie osiem znaków. <xs:element name="password"> <xs:simpletype> <xs:restriction base="xs:string"> <xs:minlength value="5"/> <xs:maxlength value="8"/> </xs:restriction> </xs:simpletype> </xs:element>
XML Schema typy złożone Typy złożone (complex data types) wykorzystujemy elementy i atrybuty. <xs:complextype name="nazwa typu">... </xs:complextype> Definiując typy złożone możemy wykorzystać następujące elementy: sequence ciąg elementów typów wbudowanych (ważna kolejność) all elementy typów wbudowanych z których wszystkie muszą się pojawić. choice elementy do wyboru.
XML Schema typy złożone Przykład 25 Deklaracja typu: <xs:complextype name="lecturertype"> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:sequence> <xs:attribute name="title" type="xs:string" use="xs:optional"/> </xs:complextype>
XML Schema typy złożone Przykład 26 i wykorzystanie zdefiniowanego typu: <xs:element name="wykladowca"> <xs:complextype> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:sequence> <xs:attribute name="title" type="xs:string" use="xs:optional"/> </xs:complextype> </xs:element>
XML Schema typy złożone Przykład 27 rozdzielenie definicji elementu i typu: <xs:element name="wykladowca" type="lecturertype"> <xs:complextype name="lecturertype"> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:sequence> <xs:attribute name="title" type="xs:string" use="xs:optional"/> </xs:complextype>
XML Schema typy złożone Przykład 28 Zdefiniujemy typy danych które mogą pojawić się w dokumencie XML będącym listem. <xs:element name="letter"> <xs:complextype mixed="true"> <xs:sequence> <xs:element name="greeting"/> <xs:element name="body"/> <xs:element name="closing"/> </xs:sequence> </xs:complextype> </xs:element> Typ złożony może posiadać atrybut mixed, który określa czy w elemencie danego typu mogą pojawić sie dane znakowe.
XML Schema typy złożone <xs:element name="greeting"> <xs:complextype mixed="true"> <xs:choice> <xs:element name="hello"/> <xs:element name="hi"/> <xs:element name="dear"/> </xs:choice> </xs:complextype> </xs:element> <xs:element name="body"> <xs:complextype mixed="true"> <xs:all> <xs:element name="item"/> <xs:element name="price"/> <xs:element name="arrivaldate"/> </xs:all> </xs:complextype> </xs:element>
XML Schema typy złożone Zdefiniowany przez nas list może wyglądać następująco: <letter> <greeting><hello/> Bob!</greeting> <body> Thank you for ordering the <item/> ($<price/>), it should arrive by <arrivaldate/>. </body> </letter>
XML Schema typy złożone Rozszerzanie typów dany rozszerzamy zdefniowane wcześniej typy danych przez dodanie nowych elementów lub atrybutów. Przykład 29 <xs:complextype name="lecturertype"> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:sequence> <xs:attribute name="title" type="xs:string" use="xs:optional"/> </xs:complextype> Chcemy rozszerzyć typ lecturertype do typu extendedlecturertype przez dodanie informacji o adresie e-mail.
XML Schema typy złożone <xs:complextype name="extendedlecturertype"> <xs:complexcontent> <xs:extension base="lecturertype"> <xs:element name="email" type="xs:string" minoccurs="0" maxoccurs="1"/> </xs:extension> </xs:complexcontent> </xs:complextype> Otrzymany w ten sposób następujący typ danych: <xs:complextype name="extendedlecturertype"> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> <xs:element name="email" type="xs:string" minoccurs="0" maxoccurs="1"/> </xs:sequence> <xs:attribute name="title" type="xs:string" use="xs:optional"/> </xs:complextype>
XML Schema typy złożone Ograniczanie typów dany ograniczamy typ danych przez dodanie więzów (ograniczeń) na pewne wartości. Przykład 30 <xs:complextype name="lecturertype"> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:sequence> <xs:attribute name="title" type="xs:string" use="xs:optional"/> </xs:complextype> Chcemy ograniczyć typ lecturertype do typu restrictedlecturertype w którym ograniczona będzie ilość wystąpień firstname oraz atrybut title będzie wymagany.
XML Schema typy złożone Rozwiązanie: <xs:complextype name="restrictedlecturertype"> <xs:complexcontent> <xs:restriction base="lecturertype"> <xs:sequence> <xs:element name="firstname" type="xs:string" minoccur="1" maxoccur="2"/> </xs:sequence> <xs:attribute name="title" type="xs:string" use="xs:required"/> </xs:restriction> <xs:complexcontent> </xs:complextype>
XML Schema typy złożone Przykład 31 XML schema dla poczty elektronicznej (pominięty prefix xs) <element name="email" type="emailtype"> <complextype name="emailtype"> <sequence> <element name="head" type="headtype"/> <element name="body" type="bodytype"/> </sequence> </complextype>
XML Schema typy złożone <complextype name="headtype"> <sequence> <element name="from" type="nameadress"/> <element name="to" type="nameadress" minoccurs="1" maxoccurs="unbounded"/> <element name="cc" type="nameadress" minoccurs="0" maxoccurs="unbounded"/> <element name="subject" type="string"/> </sequence> <complextype> <complextype name="nameadress"> <attribute name="name" type="string" use="optional"/> <attribute name="adress" type="string" use="required"/> </xs:complextype>
XML Schema typy złożone <complextype name="bodytype"> <sequence> <element name="text" type="string"/> <element name="attachment" minoccurs="0" maxoccurs="unbounded"/> <complextype> <attribute name="encoding" use="default" value="mime"> <simpletype> <restriction base="string"> <enumeration value="mime"/> <enumeration value="binhex"/> </restriction> </simpletype> </attribute> <attribute name="file" type="string" use="required"/> </complextype> </element> </sequence> </complextype>