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.