Plan Przetwarzanie dokumentów XML i zaawansowane techniki WWW Wykład 02 T. Romańczukiewicz Jagiellonian University 2009/2010
Plan Plan 1 Przypomnienie 2 DTD 3 Schematy XML 4 Podsumowanie
Plan Przypomnienie DTD Schematy XML Podsumowanie 1 Przypomnienie 2 DTD 3 Schematy XML 4 Podsumowanie
Przypomnienie DTD Schematy XML Podsumowanie Przypomnienie: XML - język znaczników zaprojektowany do przechowywania danych. Do prezentowania danych bezpośrednio zawartych w XML można użyć np. arkuszy kaskadowych CSS. XML pozwala na praktycznie nieograniczona dowolność. Strukturę określa się zagnieżdżajac znaczniki, dodatkowe informacje można przechowywać w atrybutach. W wielu praktycznych zastosowaniach należy jednak ograniczyć tę dowlolność - definicja typu dokumentu DTD. Jeśli dokument jest poprawnie sformułowany wg rekomendacji W3C można go walidować czyli sprawdzać jego zgodność z DTD. Zawartość dokumentów można czytać przy pomocy np. JavaScript. Kilka różnych dokumentów można łaczyć w jedna całość, a nazwy elementów z różnych DTD rozróżnia się poprzez przestrzenie nazw.
Plan Przypomnienie DTD Schematy XML Podsumowanie DTD - potrzeba, zalety i wady Konstrukcja DTD Definicje atrybutów E 1 Przypomnienie 2 DTD DTD - potrzeba, zalety i wady Konstrukcja DTD Definicje atrybutów Encje 3 Schematy XML 4 Podsumowanie
Przypomnienie DTD Schematy XML Podsumowanie DTD - potrzeba, zalety i wady Konstrukcja DTD Definicje atrybutów E Struktura dokumentu XML został tak skonstruowany aby pozwalał na maksymalna dowolność (struktura dokumentu, nazwy znaczników itp). Czasami jednak warto określić pewne ramy jakich dokument musi się trzymać. Zabieg ten może przyspieszyć przetwarzanie danych w dokumencie oraz zapobiega powstawaniu ewentualnych błędów już podczas etapu tworzenia dokumentu. Definicja typu dokumentu (DTD, ang. Document Type Definition) formalny opis budowy zawierajacego informacje o nazwach przyporzadkowanych częściom składowym tekstu (elementach), ich dodatkowych własnościach (atrybutach) i zależnosciach pomiedzy elementami, łacz acych je w strukturę drzewiasta
Przypomnienie DTD Schematy XML Podsumowanie DTD - potrzeba, zalety i wady Konstrukcja DTD Definicje atrybutów E DTD a Schematy XML Strukturę dokumentu można opisać na dwa sposoby: Definicje typu dokumentów Schematy XML W chwili obecnej najczęściej używa się DTD. Jest to jednak metoda bardzo ograniczona i mało precyzyjna. Schematy XML nie tylko opisuja sama strukturę dokumentu, ale również pozwalaja na określanie typu danych w treści elementów dziedziczenie składni określanie minimalnej i maksymalnej ilości wystapień elementu ograniczanie wartości danych wymuszanie niepowtarzalności atrybutów (...) wiele, wiele innych - o tym w dalszej części Alternatywy: Relax NG, Schematron i inne
Przypomnienie DTD Schematy XML Podsumowanie DTD - potrzeba, zalety i wady Konstrukcja DTD Definicje atrybutów E Budowa DTD Listing 1: Przykład DTD 1 <?xml version="1.0" encoding="utf-8"?> 2 <?xml-stylesheet type="text/css" href="katalog.css"?> 3 <!DOCTYPE CATALOG [ 4 <!ELEMENT CATALOG (Artist+) > 5 <!ELEMENT Artist (Artist-Name, Album+) > 6 <!ELEMENT Artist-Name (#PCDATA) > 7 <!ELEMENT Album (Title, Year) > 8 <!ELEMENT Title (#PCDATA) > 9 <!ELEMENT Year (#PCDATA) > 10 <!ATTLIST Album id CDATA "100" >]> <!ELEMENT nazwa elementu (model zawartosci)> element+ element wystapi jeden lub więcej razy, element* 0 lub więcej razy, element? 0 lub 1 raz, element1, element2 elementy wystapi a w podanej kolejności, element1 element2 wystapi element1 lub element2 (grupa) grupa składników modelu, #PCDATA wystapi zawartość tekstowa ( czysty tekst bez podelementów), EMPTY element nie posiada żadnej zawartości, ANY w treści moga wystapić dowolne zadeklarowane elementy.
Przypomnienie DTD Schematy XML Podsumowanie DTD - potrzeba, zalety i wady Konstrukcja DTD Definicje atrybutów E Model mieszany. Czasami zachodzi konieczność wymieszania danych wraz z elementami. Np gdy chcemy dodać dodatkowy element - dodatkowa uwaga, data itp, a nie jest to konieczne dla każdego elementu. <!ELEMENT nazwa_elementu (#PCDATA uzupelnienie )*> i można tego używać w następujacy sposób: Listing 2: Model mieszany 1 <nazwa_elemetu> 2 zawartosc pierwszego elementu 3 </nazwa_elemetu> 4 5 <nazwa_elemetu> 6 zawartosc drugiego elementu 7 <uzupelnienie> 8 to jest drugi element 9 </uzupelnienie> 10 </nazwa_elemetu>
Przypomnienie DTD Schematy XML Podsumowanie DTD - potrzeba, zalety i wady Konstrukcja DTD Definicje atrybutów E Definicja atrybutu Listing 3: Przykład definicji atrybutu 1 <!ATTLIST nazwa elementu nazwa atrybutu1 typ1 zawartosc1 2 nazwa atrybutu2 typ2 zawartosc2 3...> Typy atrybutów: CDATA ciag znaków, NMTOKEN ciag znaków tworzacych poprawna nazwę, NMTOKENS ciag NMTOKEN oddzielanych spacjami, ID identyfikator unikalny w obrębie dokumentu, IDREF wskaźnik do ID innego elementu, IDREFS ciag IDREF oddzielany białymi znakami, (a b...) jedna z podanych wartości (typ wyliczeniowy), #REQUIRED atrybut jest wymagany, #IMPLIED wartość nie musi być podana, wartosc wartość domyślna, w dokumencie można ja zmieniać #FIXED wartość stała.
Przypomnienie DTD Schematy XML Podsumowanie DTD - potrzeba, zalety i wady Konstrukcja DTD Definicje atrybutów E Elementy czy atrybuty w elementach należy zapisywać istotny tekst, który będzie wypisywany, w atrybutach dodatkowe parametry w elementach należy zapisywać dane, a w atrybutach metadane elementy można zagnieżdżać, atrybuty nie - nie maja wewnętrznej struktury kolejność atrybutów nie ma znaczenia, dla elementów jest ważna w DTD można tylko atrybutom można przyporzadkowywać wartości domyślne. Listing 4: Umieszczanie DTD w osobnym pliku 1 <!DOCTYPE element_glowny SYSTEM "uri_do_dtd.dtd">
Przypomnienie DTD Schematy XML Podsumowanie DTD - potrzeba, zalety i wady Konstrukcja DTD Definicje atrybutów E Encje W DTD można definiować też makrorozwinięcia - encje: Listing 5: Definicje encji wewnętrznych 1 <!ENTITY nazwa_encji "rozwiniecie"> 2... 3 <przyklad> 4 przyklad uzycia encji &nazwa_encji; 5 </przyklad> 6... W XML można korzystać z kilku predefiniowanych encji: ' " " & & < < > > Można też używać ich do odwołań do znaków w kodzie dziesiętnym &#kod_znaku; oraz #xkod_znaku; w kodzie szesnastkowym.
Przypomnienie DTD Schematy XML Podsumowanie DTD - potrzeba, zalety i wady Konstrukcja DTD Definicje atrybutów E Encje zewnętrzne Listing 6: Przykład użycia encji zewnętrznych 1 <!ENTITY klasyka SYSTEM "klasyka_rocka.xml"> 2 <!ENTITY NWOBHM SYSTEM "NWOBHM.xml"> 3 <!ENTITY Thrash SYSTEM "http://prunus.if.uj.edu.pl/slayer_itp.xml"> 4 5 <CATALOG> 6 &klasyka; 7 &NWOBHM; 8 &Thrash; 9... 10 </CATALOG> Właczanie DTD jest również encję zewnętrzna: <!DOCTYPE element_glowny SYSTEM "uri_do_dtd.dtd">
Przypomnienie DTD Schematy XML Podsumowanie DTD - potrzeba, zalety i wady Konstrukcja DTD Definicje atrybutów E Encje parametryczne Encje parametryczne definiuje się i używa przy pomocy znaku %: Listing 7: Przykład użycia encji zewnętrznych 1 <!ENTITY % fontstyle "TT I B U"> 2 <!ENTITY % inline "#PCDATA %fontstyle;"> 3 <!ELEMENT p (%inline;)*> 4 <!ELEMENT font (%inline;)*> Można używać np. do definicji elementów w razie potrzeby dodać lub zmienić jeden fragment wykorzystywany w definicji wielu elementów. Możliwe jest też właczanie lub wyłaczanie fragmentów DTD poprzez instrukcje: Listing 8: Przykład użycia encji zewnętrznych 1 <![INCLUDE[... definicja_uzywana... ]]> 2 <![IGNORE[... definicja_nieuzywana... ]]> Można teraz łatwo tworzyć kilka wersji DTD w jednym tylko dokumencie i właczać pewne sekcje DTD parametrycznie.
Przypomnienie DTD Schematy XML Podsumowanie DTD - potrzeba, zalety i wady Konstrukcja DTD Definicje atrybutów E Wady DTD duża złożoność brak możliwości określania tekstowej zawartości atrybutów mało dokładne określanie ilości wystapień danego elementu (+,?, ) brak struktury XML w DTD Rozwiazanie: schematy XML
Plan Przypomnienie DTD Schematy XML Podsumowanie Przykłady Elementy proste i złożone Definicje typów Dodatkowe moż 1 Przypomnienie 2 DTD 3 Schematy XML Przykłady Elementy proste i złożone Definicje typów Dodatkowe możliwości 4 Podsumowanie
Przypomnienie DTD Schematy XML Podsumowanie Przykłady Elementy proste i złożone Definicje typów Dodatkowe moż Schemat XML Listing 9: Przykład schematu XML 1 <?xml version="1.0" encoding="utf-8"?> 2 <xs:schema xmlns:xs="http://www.w3.org/2001/xmlschema"> 3... 4 </xs:schema> i użycie referencji do schematu w pliku XML jako przestrzeni nazw: Listing 10: Plik XML 1 <?xml version="1.0" encoding="utf-8"?> 2 <element_glowny xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:nonamespaceschemalocation="moj_schemat.xsd"> 3... 4 </element_glowny>
Przypomnienie DTD Schematy XML Podsumowanie Przykłady Elementy proste i złożone Definicje typów Dodatkowe moż W XML rozróżniamy kilka typów elementów typ prosty - element zawierajacy jedynie dane proste (liczby, tekst) typ złożony - element zawierajacy inne elementy badź atrybuty każdy atrybut jest typem prostym - nie może zawierać ani atrybutów ani elementów W schemacie typy złożone deklaruje autor, typy proste sa już zawarte w specyfikacji. Autor jednak może tworzyć nowe typy proste.
Przypomnienie DTD Schematy XML Podsumowanie Przykłady Elementy proste i złożone Definicje typów Dodatkowe moż Przykład schematu Listing 11: Przykład schematu XML2 1 <xsd:schema xmlns:xsd="http://www.w3.org/2001/xmlschema"> 2 3 <xsd:complextype name="adres"> 4 <xsd:element name="nazwisko" type="xsd:string"/> 5 <xsd:element name="imie" type="xsd:string"/> 6 <xsd:element name="ulica" type="xsd:string"/> 7 <xsd:element name="nr_domu" type="xsd:int"/> 8 <xsd:element name="nr_mieszkania" type="xsd:int" use="optional"/> 9 </xsd:complextype> 10 11 <xsd:simpletype name="nr_ewidencyjny"> 12 <xsd:pattern value="\d{2}-\d{5}" base="xsd:string"/> 13 </xsd:simpletype> 14 15 <xsd:element name="moj_adres" type="adres" maxoccurs="1"/> 16 </xsd:schema> Definiujemy przestrzeń nazw xsd, typ złożony adres oraz typ prosty nr_ewidencyjny składajacy się z dwóch cyfr, kreski i pięciu cyfr.
Przypomnienie DTD Schematy XML Podsumowanie Przykłady Elementy proste i złożone Definicje typów Dodatkowe moż Wbudowane typy proste Poniżej wykaz typów jakich można używać: binary,boolean, byte, century,date, decimal, double, float, int, integer, long ENTITIES, ENTITY, ID, IDREF, IDREFS, language, month, Name, NCName, NMTOKEN,NMTOKENS,NOTATION negativeinteger, nonnegativeinteger, nonpositiveinteger, positiveinteger,qname, recurringdate, recurringday, recurringduration, short, string,time timeduration, timeinstant, timeperiod, unsignedbyte,unsignedint, unsignedlong, unsignedshort, urireference, year
Przypomnienie DTD Schematy XML Podsumowanie Przykłady Elementy proste i złożone Definicje typów Dodatkowe moż Krotność wystapienia elementu określa się przy pomocy następujacych atrybutów: minoccurs, maxoccurs. Domyślnie maxoccurs=minoccurs. Bez ograniczeń: maxoccurs="unbounded" Można też użyć jednego z dwóch atrybutów fixed lub default W deklaracji atrybutu <xsd:attribute name="licznik"value="100"type="xsd:int"> możliwe jest użycie atrybutu use który może mieć jedna z następujacych wartości required, optionaln fixed, default, prohibited. Gdy use="default"value="100" to jeśli wartość nie zostanie określona w samym atrybucie to przypisana zostanie wartość domyślna.
Przypomnienie DTD Schematy XML Podsumowanie Przykłady Elementy proste i złożone Definicje typów Dodatkowe moż Definicje typów prostych Listing 12: Typy proste 1 <xsd:schema xmlns:xsd="http://www.w3.org/2001/xmlschema"> 2 3 <xsd:simpletype name="nr_ewidencyjny"> 4 <xsd:pattern value="\d{2}-\d{5}" base="xsd:string"/> 5 </xsd:simpletype> 6 7 <xsd:simpletype name="dzienmiesiaca" base="xsd:integer"> 8 <xsd:mininclusive value="1"/> 9 <xsd:maxinclusive value="31"/> 10 </xsd:simpletype> 11 12 <xsd:simpletype name="dzientygodnia" base="xsd:string"> 13 <xsd:enumeration value="poniedzialek"/> 14 <xsd:enumeration value="wtorek"/> 15 <xsd:enumeration value="sroda"/> 16 <xsd:enumeration value="czwartek"/> 17 <xsd:enumeration value="piatek"/> 18 <xsd:enumeration value="sobota"/> 19 <xsd:enumeration value="niedziela"/> 20 </xsd:simpletype> 21 22 </xsd:schema> Uwaga: wyrażenie używane do formatowania xsd:pattern maja postać wyrażeń regularnych Perla!
Przypomnienie DTD Schematy XML Podsumowanie Przykłady Elementy proste i złożone Definicje typów Dodatkowe moż Anonimowe definicje typów Czasami nie ma konieczności definiowania osobnych typów. Dzieje się tak w przypadku, gdy dany tym byłby użyty np. jedynie raz. Można wtedy zamiast xsd:simpletype czy xsd:complextype użyć po prostu xsd:element lub xsd:attribute bez podawania typu. Można też definiować elementy puste: Listing 13: Przykład anonimowej definicji typu 1 <xsd:element name="album" minoccurs="0" maxoccurs="50"> 2 <xsd:complextype> 3 <xsd:element name="title" type="xsd:string"/> 4 <xsd:element name="year" type="xsd:year"/> 5 <xsd:attribute name="id" type="xsd:string"/> 6 </xsd:complextype> 7 </xsd:element> 8 9 <xsd:element name="cover"> 10 <xsd:complextype content="empty"> 11 <xsd:attribute name="source" type="xsd:string"/> 12 <xsd:attribute name="width" type="xsd:integer"/> 13 <xsd:attribute name="height" type="xsd:integer"/> 14 </xsd:complextype> 15 </xsd:element>
Przypomnienie DTD Schematy XML Podsumowanie Przykłady Elementy proste i złożone Definicje typów Dodatkowe moż Elementy mieszane Można też definiować typ mieszany: elementy + zwykły tekst dzięki atrybutowi content="mixed". W DTD można było jedynie określić zawartość bez kolejności występowania. W schematach mamy możliwość podawania kolejności i krotności występowania poszczególnych elementów. Listing 14: Elementy mieszane 1 <xsd:element name="przypominajka"> 2 <xsd:complextype content="mixed"> 3 <xsd:element name="nazwisko" type="xsd:string"/> 4 <xsd:element name="tytul" type="xsd:string"/> 5 <xsd:element name="terminmaksymalny"> 6 <xsd:simpletype base="xsd:integer"> 7 <xsd:maxexclusive value="14"/> 8 </xsd:simpletype> 9 </xsd:element> 10 <xsd:element name="wartosc" type="xsd:decimal"/> 11 </xsd:complextype> 12 </xsd:element> Atrybut content może przyjmować również wartości "elementonly" - wartość domyślna dla typów złożonych "textonly" - domyślny model zawartości dla typu prostego
Przypomnienie DTD Schematy XML Podsumowanie Przykłady Elementy proste i złożone Definicje typów Dodatkowe moż Komentarze w schematach W schematach XML używa się trzech typów komentarzy: np: xsd:annotation - ogólny komentarz zawierajacy dwa pozostałe - bardziej szczegółowe xsd:documentation - typowy komentarz przeznaczony dla czytajacych dokument xsd:appinfo - informacje dla aplikacji czytajacych dokument Listing 15: komentarze 1 <xsd:annotation> 2 <xsd:documentation> 3 Jakis komentarz dla przyszlych pokolen 4 </xsd:documentation> 5 </xsd:annotation>
Przypomnienie DTD Schematy XML Podsumowanie Przykłady Elementy proste i złożone Definicje typów Dodatkowe moż xsd:choice Wybór umożliwia wskazanie szeregu elementów, z których zostanie wybrany zawsze tylko jeden Listing 16: Marny wybór 1 <xsd:element name="person"> 2 <xsd:complextype> 3 <xsd:choice> 4 <xsd:element name="employee" type="employee"/> 5 <xsd:element name="member" type="member"/> 6 </xsd:choice> 7 </xsd:complextype> 8 </xsd:element> Można też tworzyć sekwencje, aby wymusić kolejność użycia elementów: Listing 17: Marny wybór 1 <xsd:element name="person"> 2 <xsd:complextype> 3 <xsd:sequence> 4 <xsd:element name="firstname" type="xsd:string"/> 5 <xsd:element name="lastname" type="xsd:string"/> 6 </xsd:sequence> 7 </xsd:complextype> 8 </xsd:element>
Przypomnienie DTD Schematy XML Podsumowanie Przykłady Elementy proste i złożone Definicje typów Dodatkowe moż All i group Oprócz indykatorów wyboru i sekwencji można używać także indykatoru xsd:all. Jego użycie oznacza, że wszystkie elementy musza zostać wykorzystane dokładnie raz: Listing 18: All 1 <xsd:element name="person"> 2 <xsd:complextype> 3 <xsd:all> 4 <xsd:element name="firstname" type="xsd:string"/> 5 <xsd:element name="lastname" type="xsd:string"/> 6 </xsd:all> 7 </xsd:complextype> 8 </xsd:element>
Przypomnienie DTD Schematy XML Podsumowanie Przykłady Elementy proste i złożone Definicje typów Dodatkowe moż Pojawienie się którejś z powyższych trzech konstrukcji można zawrzeć wewnatrz grupy a po zdefiniowaniu całej grupy można się do niej odwołać: Listing 19: Grupowanie 1 <xsd:group name="persongroup"> 2 <xsd:sequence> 3 <xsd:element name="firstname" type="xsd:string"/> 4 <xsd:element name="lastname" type="xsd:string"/> 5 <xsd:element name="birthday" type="xsd:date"/> 6 </xsd:sequence> 7 </xsd:group> 8 9 <xsd:element name="person" type="personinfo"/> 10 11 <xsd:complextype name="personinfo"> 12 <xsd:sequence> 13 <xsd:group ref="persongroup"/> 14 <xsd:element name="country" type="xsd:string"/> 15 </xsd:sequence> 16 </xsd:complextype>
Przypomnienie DTD Schematy XML Podsumowanie Przykłady Elementy proste i złożone Definicje typów Dodatkowe moż Grupy można również tworzyć dl atrybutów: Listing 20: Grupy atrybutów 1 <xsd:attributegroup name="personattrgroup"> 2 <xsd:attribute name="firstname" type="xsd:string"/> 3 <xsd:attribute name="lastname" type="xsd:string"/> 4 <xsd:attribute name="birthday" type="xsd:date"/> 5 </xsd:attributegroup> 6 7 <xsd:element name="person"> 8 <xsd:complextype> 9 <xsd:attributegroup ref="personattrgroup"/> 10 </xsd:complextype> 11 </xsd:element>
ANY Przypomnienie DTD Schematy XML Podsumowanie Przykłady Elementy proste i złożone Definicje typów Dodatkowe moż Czasami nawet najlepiej przemyślany schemat musi dopuszczać możliwość rozszerzenia o kolejny niezdefiniowany element. Do tego typu deklaracji służy xsd:any. Można też rozszerzyć definicję o dowolny atrybut xsd:anyattribute Listing 21: Rozszerzenie definicji o dowolny element 1 <xsd:element name="person"> 2 <xsd:complextype> 3 <xsd:sequence> 4 <xsd:element name="firstname" type="xsd:string"/> 5 <xsd:element name="lastname" type="xsd:string"/> 6 <xsd:any minoccurs="0"/> 7 </xsd:sequence> 8 <xsd:anyattribute/> 9 </xsd:complextype> 10 </xsd:element>
Przypomnienie DTD Schematy XML Podsumowanie Przykłady Elementy proste i złożone Definicje typów Dodatkowe moż substitutiongroup Łatwo wyobrazić sobie sytuacje kiedy schemat jest dobrze napisany, ale wszystkie nazwy elementów sa w języku angielskim. XML z założenia ma opisywać dane tak aby łatwo się je czytało. Można użyć podstawienia, które zamiast nazwy np. w języku angielskim pozwoli używać nazw w języku polskim: Listing 22: substitutiongroup 1 <xsd:element name="name" type="xsd:string"/> 2 <xsd:element name="nazwisko" substitutiongroup="name"/> 3 4 <xsd:complextype name="custinfo"> 5 <xsd:sequence> 6 <xsd:element ref="name"/> 7 </xsd:sequence> 8 </xsd:complextype> 9 10 <xsd:element name="customer" type="custinfo"/> 11 <xsd:element name="klient" substitutiongroup="customer"/> Listing 23: XML 1 <klient> 2 <nazwisko>jan Kowalski</nazwisko> 3 </klient> 4 5 <customer> 6 <name>john Smith</name> 7 </customer> Używaj ac atrybutu block="substitution" można zabronić podstawienia nazwy
Plan Przypomnienie DTD Schematy XML Podsumowanie 1 Przypomnienie 2 DTD 3 Schematy XML 4 Podsumowanie
Przypomnienie DTD Schematy XML Podsumowanie Podsumowanie Aby wymusić konkretna strukturę dokumentu i zawartość elementów używa się DTD lub schematów DTD sa bardziej rozpowszechnione jednak maja wiele ograniczeń (np. brak możliwości dokładnego określania ilości wystapień elementów). DTD jest osobnym "językiem" określajacym strukturę dokumentu Schematy pozwalaja na dużo dokładniejsza kontrolę struktury dokumentu, oraz bardziej systematyczne określanie zawartości Sa poprawnie sformułowanym dokumentem XML