XML 2
Transkrypt
XML 2
XML – eXtensible Markup Language część 2 Definicja Typu Dokumentu - DTD DTD (ang. Document Type Definition) – rodzaj dokumentu definiujący formalną strukturę dokumentów XML. DTD określa składnię konkretnej aplikacji XML czyli: • definiuje każdy dopuszczalny element atrybutów i dopuszczalne wartości. dokumentu, jego zbiór • określa zagnieżdżanie i wymagalność poszczególnych elementów w dokumencie. Przykład 1 W dokumencie XHTML element li może pojawić się tylko jako dziecko elementów ol lub ul. Informacja o tym zapisana jest właśnie w odpowiednim dokumencie DTD. 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 - ang. valid). 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. Definicja Typu Dokumentu - DTD Przykład 2 Rozważmy następujący dokument XML <person> <name> <first_name>Alan</first_name> <last_name>Turing</last_name> </name> <profession>computer scientist</profession> <profession>mathematician</profession> <profession>cryptographer</profession> </person> Jak może wyglądać DTD dla tego dokumentu? Deklaracja Typu Dokumentu Poprawny dokument XML musi zawierać deklaracje związanego z nim DTD. Przykład 3 <!DOCTYPE person SYSTEM "http://www.cafeconleche.org/dtds/person.dtd"> Deklaracja ta mówi, że korzeniem dokumentu jest element person oraz, że DTD dla tego dokumentu znajduje się pod adresem http://www.cafeconleche.org/dtds/person.dtd Deklaracja typu dokumentu znajduje się zawsze na początku dokumentu zaraz po deklaracji XML i przed korzeniem dokumentu. Deklaracja Typu Dokumentu Przykład 4 <?xml version="1.0" standalone="no"?> <!DOCTYPE person SYSTEM "http://www.cafeconleche.org/dtds/person.dtd"> <person> <name> <first_name>Alan</first_name> <last_name>Turing</last_name> </name> <profession>computer scientist</profession> <profession>mathematician</profession> <profession>cryptographer</profession> </person> Jeżeli dokument DTD znajduje się w tym samym folderze co dokument XML: <!DOCTYPE person SYSTEM "person.dtd"> Deklaracja Typu Dokumentu Deklaracja typu dokumentu zwykle znajduje się w oddzielnym pliku. Można ją jednak umieścić w dokumencie XML. Przykład 5 <?xml version="1.0"?> <!DOCTYPE person [ <!ELEMENT first_name (#PCDATA)> <!ELEMENT last_name (#PCDATA)> <!ELEMENT profession (#PCDATA)> <!ELEMENT name (first_name,last_name)> <!ELEMENT person (name,profession*)> ]> <person> <name> <first_name>Alan</first_name> <last_name>Turing</last_name> </name> <profession>computer scientist</profession> <profession>mathematician</profession> <profession>cryptographer</profession> </person> Deklaracje Elementów Deklaracja elementu ma następującą postać: <!ELEMENT nazwa_elementu zawartość_elementu> nazwa_elementu – określa nazwę elementu. zawartość_elementu – określa dzieci elementu i ich uporządkowanie. Zawartość elementu Tekst - najprostszą zawartością elementu jest zwykły tekst. Oznaczamy go przez #PCDATA. Przykład 6 <!ELEMENT phone_number (#PCDATA)> Deklaracje Elementów Dzieci – deklarowany przez nas element może posiadać dzieci. Przykład 7 <!ELEMENT name (first_name, last_name)> Deklaracja ta oznacza, że element name posiada dzieci (kolejność ważna!!!): first_name , second_name Dla powyższej deklaracji elementu name poprawny jest dokument: <name> <first_name>Madonna</first_name> <last_name>Ciconne</last_name> </name> Nie jest poprawny dokument: <name> <last_name>Ciconne</last_name> <first_name>Madonna</first_name> </name> Deklaracje Elementów W DTD możemy określić liczbę dzieci danego elementu wykorzystując następujące oznaczenia: ? – zero lub jeden element * - zero lub więcej elementów + - jeden lub więcej elementów Przykład 8 <!ELEMENT name (first_name, middle_name?, last_name?)> Element first_name jest wymagany. Element middle_name może nie wystąpić lub wystąpić tylko raz. Element last_name może nie wystąpić lub wystąpić tylko raz. Deklaracje Elementów Dla powyższej deklaracji następujący dokument XML nie jest poprawny. <name> <first_name>George</first_name> <middle_name>Herbert</middle_name> <middle_name>Walker</middle_name> <last_name>Bush</last_name> </name> <name> <last_name>Ciconne</last_name> <first_name>Madonna</first_name> </name> Przykład 9 <!ELEMENT name (first_name,middle_name*,last_name?)> Element middle_name może nie wystąpić lub wystąpić wiele razy. Deklaracje Elementów Może się zdarzyć, że dwa różne przykłady tego samego elementu będą zawierały różne elementy-dzieci. Przykład 10 <!ELEMENT transport (train|bus|car)> Dzieckiem elementu transport może być train lub bus lub car. Elementy mogą mieć bardziej skomplikowane definicje. Przykład 11 <!ELEMENT center ((x, y)|(r,))> Dziećmi elementu center mogą być x i y lub r i . Deklaracje Elementów Przykład 12 <!ELEMENT a (b|(c+,d))> Dzieckiem elementu a może być: b lub jedno lub wiele c i d Przykład 13 <!ELEMENT definition (#PCDATA|term)*> Dzieckiem elementu definition dowolną ilość elementów term. może być tekst zawierający Deklaracje Elementów Poniższy dokument jest poprawny ze względu na powyższą deklarację: <definition>The <term>Turing Machine</term> is an abstract finite state automaton with infinite memory that can be proven equivalent to any any other finite state automaton with arbitrarily large memory. Thus what is true for a Turing machine is true for all equivalent machines no matter how implemented. </definition> Element pusty deklarujemy następująco: <!ELEMENT image EMPTY> Deklaracje Elementów I na koniec DTD dla dokumentu z przykładu 15 tzn: <person> <name> <first_name>Alan</first_name> <last_name>Turing</last_name> </name> <profession>computer scientist</profession> <profession>mathematician</profession> <profession>cryptographer</profession> </person> DTD: <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT person (name, profession*)> name (first_name, last_name)> first_name (#PCDATA)> last_name (#PCDATA)> profession (#PCDATA)> Atrybuty Poprawny strukturalnie dokument (valid) musi mieć zadeklarowane atrybuty wszystkich elementów. Wykorzystujemy w tym celu instrukcję ATTLIST Atrybuty deklarujemy oddzielnie dla każdego elementu. Elementy mogą posiadać kilka atrybutów. Przykład 14 <!ATTLIST image source width height alt > CDATA CDATA CDATA CDATA #REQUIRED #REQUIRED #REQUIRED #IMPLIED Atrybuty Pojedynczy element ATTLIST może deklarować wiele atrybutów dla tego samego elementu. Przykład 15 <!ATTLIST image source width height alt > CDATA CDATA CDATA CDATA gdzie: #REQUIRED – atrybut obowiązkowy #IMPLIED – atrybut nieobowiązkowy #REQUIRED #REQUIRED #REQUIRED #IMPLIED Atrybuty Istnieją następujące typy atrybutów: 1. CDATA – dowolny ciąg znaków. Przykład 16 <!ATTLIST image alt CDATA #IMPLIED> 2. ID – nazwa która jest wyjątkowa w całym dokumencie XML. Przykład 17 <!ATTLIST pracownik nr ID #REQUIRED> <pracownik nr="ss9876-12-3456"> <imie>Tomek</imie> <nazwisko>Nowak</nazwisko> </pracownik> Atrybuty 3. NMTOKEN - składa się z tych samych znaków co nazwy XML. Może się zaczynać od dowolnej litery i znaku. Przykład 18 <!ATTLIST journal year NMTOKEN #REQUIRED> 4. NMTOKENS - składa się z kilku wartości NMTOKEN przedzielonych spacjami. Przykład 19 <performances dates="08-21-2001 08-23-2001 08-27-2001"> Kat and the Kings </performances> Atrybuty 5. (v1 | v2 | ... |vn) - wszystkie możliwe wartości. Przykład 20 <!ATTLIST date month (January|February|March|April|May |June|July|August|September|October|November|December) #REQUIRED> <!ATTLIST date day (1|2|3|4|5|6|7|8|9|10|11|12|13|14| 15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31) #REQUIRED> <!ELEMENT date EMPTY> Atrybuty 6. IDREF – odwołanie do innego elementu z atrybutem ID. Przykład 21 <!ATTLIST <!ATTLIST <!ATTLIST <!ATTLIST pracownik id ID #REQUIRED> projekt id ID #REQUIRED> sklad pracownik_id IDREF #REQUIRED> wprojekcie projekt_id IDREF #REQUIRED> <pracownik id="ss9876-12-3456"> <wprojekcie projekt_id="p2"/> </pracownik> <projekt id="p2"> <sklad pracownik_id="ss9876-12-3456"/> </projekt> 7. IDREFS – ciąg kilku IDREF rozdzielonych spacjami. Typy wartości atrybutów #REQUIRED – atrybut musi pojawić się z każdym wystąpieniem elementu. #IMPLIED – atrybut nieobowiązkowy. #FIXED "wartość" – atrybut obowiazkowy o wartości określonej przez wartość. Przykład 22 <!ATTLIST biography xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink"> "wartość" – wartość domyślna atrybutu. Przykład 23 <!ATTLIST web_page protocol NMTOKEN "http"> Przestrzenie nazw Przykład 24 Dwa muzea posiadają dokumenty XML i określone dla nich DTD (lub XML Schema) zawierające opisy eksponatów. Muzeum 1 (DTD 1): <?xml version="1.0" encoding="ISO-8859-1"> <catalog> <painting> <title> Memory of the Garden at Etten </title> <artist>Vincent Van Gogh</artist> <date>November, 1888</date> <description> Two women look to the left. A third works in her garden. </description> </painting> ... </catalog> Przestrzenie nazw Muzeum 2 (DTD 2): <?xml version="1.0" encoding="ISO-8859-1"> <catalog> <painting> <title>The Swing</title> <artist>Pierre-Auguste Renoir</artist> <date>1876</date> <description> A young girl on a swing. Two men and a toddler watch. </description> </painting> ... </catalog> Oba muzea planują wspólną wystawę swoich eksponatów. Informacja o wystawianych eksponatach ma być dostępna w Internecie. Przestrzenie nazw Katalog Muzeum 1 i Muzeum 2: <?xml version="1.0" encoding="ISO-8859-1"> <catalog> <painting> <title>Memory of the Garden at Etten</title> <artist>Vincent Van Gogh</artist> <date>November, 1888</date> <description> Two women look to the left. A third works in her garden. </description> </painting> <painting> <title>The Swing</title> <artist>Pierre-Auguste Renoir</artist> <date>1876</date> <description> A young girl on a swing. Two men and a toddler watch. </description> </painting> </catalog> Przestrzenie nazw Czy mozna w ten sposób łączyć dokumenty XML? Można, ale... ...mogą pojawić się problemy podczas walidacji jeżeli elementy w dokumencie XML zawierającym katalog Muzeum 1 są zdefiniowane inaczej niż elementy w dokumencie XML zawierającym katalog Muzeum 2. Walidator napotykając dowolny element w dokumencie musi wiedzieć czy element ten jest zdefiniowany W DTD 1 czy w DTD2. Informację taką zapisujemy wykorzystując tzw. przestrzenie nazw. Deklaracja przestrzeni nazw: xmlns:prefix="położenie" Przestrzenie nazw <?xml version="1.0" encoding="ISO-8859-1"> <m1:catalog xmlns:m1="http://www.muzeum1.pl/DTD/" xmlns:m2="http://www.muzeum1.pl/DTD/"> <m1:painting> <m1:title>Memory of the Garden at Etten</m1:title> <m1:artist>Vincent Van Gogh</m1:artist> <m1:date>November, 1888</m1:date> <m1:description> Two women look to the left. A third works in her garden. </m1:description> </m1:painting> <m2:painting> <m2:title>The Swing</m2:title> <m2:artist>Pierre-Auguste Renoir</m2:artist> <m2:date>1876</m2:date> <m2:description> A young girl on a swing. Two men and a toddler watch. </m2:description> </m2:painting> </catalog> 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.