XML i DTD

Czym jest XML?

Główna różnica między XML i HTML

Przykładowo dokument HTML:

<h1>Moi znajomi</h1>
<p><b>Michal</b>, 24 lata, <i>mich@abc.com</i></p>
<p><b>Adam</b>, 25 lat, <i>adi@abc.com</i></p>
<p><b>Bartek</b>, 29 lat, <i>barti@abc.com</i></p>

Co można o nim powiedzieć?


Te same dane w formacie XML:

<spis>
<opis>Moi znajomi</opis>
<ludzie>


<osoba>
<imie>Michal</imie>
<wiek>24</wiek>
<email>mich@abc.com</email>
</osoba>


<osoba>
<imie>Bartek</imie>
<wiek>29</wiek>
<email>barti@abc.com</email>
</osoba>


<osoba>
<imie>Adam</imie>
<wiek>25</wiek>
<email>adi@abc.com</email>
</osoba>


</ludzie>
</spis>

Co można o nim powiedzieć?

Aby dane były wyświetlone w sposób czytelny dla człowieka do dokumentow XML dołączane są arkusze stylów XSL lub CSS.

Do czego XML może zostać użyty?

Przyklad dokumentu XML:

<?xml version="1.0" encoding="ISO-8859-2"?>
<notatka>
<do>Ania</do>
<od>Janek</od>
<naglowek>Przypomnienie</naglowek>
<tresc>Nie zapomnij o spotkaniu w sobote</tresc>
</notatka>

Pierwsza linia (deklaracja XML) w tym dokumencie opisuje wersje XML (1.0) oraz kodowanie znaków (ISO-8859-2). Nastepna opisuje główny element (root element). Nazwa mówi sama za siebie (sama sie opisuje), że jest to notatka. Następne 4 linie zawieraja elementy potomki (do,od,naglowek,tresc) elementu głownego. I tutaj również dane same sie opisują. Dowiadujemy się, że notatka jest adresowana dla Ani od Janka, który przypomina jej o spotkaniu w sobote. Ostatnia linia oznacza zakończenie głównego elementu.

Głowne zasady przy tworzeniu dokumentów XML:

Elementy w XML

Nazwy elementów muszą podlegać następującym regułom:

Elementy sa rozszerzalne: Weźmy dokument z poprzedniego przykładu. Przypuśćmy, że ktoś napisał jakiś super program, który pobiera informacje o notatce i w "ładny" sposób je wyświetla lub przetwarza. Dodajmy teraz do notatki nowy element:

<?xml version="1.0" encoding="ISO-8859-2"?>
<notatka>
<data>2002-08-01</data>
<do>Ania</do>
<od>Janek</od>
<naglowek>Przypomnienie</naglowek>
<tresc>Nie zapomnij o spotkaniu w sobote</tresc>
</notatka>

Powstaje pytanie czy aplikacja przestanie dzialać? Odpowiedź brzmi: nie. Bo dalej jest w stanie znaleźć to czego potrzebuje.

Elementy mogą miec różną zawartość:

Atrybuty

Elementy dokumentu XML moga zawierac atrybuty. Są one uzywane do wprowadzania dodatkowych informacji. Wartości atrybutów muszą być umieszczone w cudzysłowach (w HTML niekoniecznie). Oczywiście może paść pytanie: Po co używać atrybutów skoro dodatkową informację można przechowywać w elementach potomnych? Takie właśnie rozwiązanie jest zalecane przez specjalistów ponieważ:

Wyjątkiem od tych zaleceń są atrybuty zawierające identyfikatory elementów i odnośniki do tych identyfikatorów.

XML i dane semistrukturalne

Podstawowa składnia XML doskonale odpowiada opisowi danych semistrukturalnych. Weźmy przykładowo dokument:


<person>
<name> Alan </name>
<age> 24 </age>
<email> alan@abc.com </email>
</person>

Przedstawienie go w postaci ssd-wyrażenia wygląda:

{ person: {name: "Alan",age: 24 ,email: "alan@abc.com" }}

Można zapisać proste przekształcenie między drzewami ssd-wyrażeń i XML. Oznaczmy to przekształcenie jako T:

T(typ prosty) = typ prosty
T({l1:v1,...,ln:vn}) = <l1>T[v1]</l1>...<ln>T[vn]</ln>

Oczywiście pewną niejednoznaczność wprowadzają atrybuty. Ponadto w dokumentach XML ważna jest kolejność elementów, ich porządek. Przykładowo dwa poniższe ssd-wyrażenia są tożsame:

person: {firstname: "John", lastname: "Smith"}
person: {lastname: "Smith", firstname: "John"}

A odpowiadające im fragmenty kodu XML nie są tożsame:

<person>
<firstname> John </firstname><lastname> Smith </lastname>
</person>

<person>
<lastname> Smith </lastname><firstname> John </firstname>
</person>

Z drugiej strony kolejność atrybutów w elemencie nie ma znaczenia i nastepujące fragmenty sa tożsame:

<person firstname="John" lastname="Smith" />
<person lastname="Smith" firstname="John" />

XML+CSS

Aby przekształcić XML do postaci HTML można zastosować dwa podejścia:

Przykład:
cd_catalog.xml
cd_catalog.css
cd_catalog_with_css.xml

Przypuszcza się jednak, że w przyszłości nie bedzie się korzystać z CSS lecz z XSL.

Wyspy danych

XML może zostać również zanurzony w dokumencie HTML. Tak wporwadzony kod XML nazywamy wyspą danych (Data Island). Dane takie moga być bezpośrednio umieszczone na stronie HTML używając nieoficjalnego znacznika <xml> (>=IE5.0):


<xml id="note">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note> </xml>

lub z zewnętrznego dokumentu XML:

<xml id="note" src="note.xml"></xml>

Następnie dane z takiej wyspy mogą byc wykorzystane np w tabelkach.

Przykład:


<html>
<body>
<xml src="cd_catalog.xml" id="xmldso" async="false"></xml>
<table datasrc="#xmldso" width="100%" border="1">
<thead>
<th>Title</th>
<th>Artist</th>
<th>Year</th>
</thead>
<tr align="left">
<td> <span datafld="TITLE"></span></td>
<td><span datafld="ARTIST"></span></td>
<td><span datafld="YEAR"></span></td>
</tr>
</table>
</body>
</html>

cd_catalog.xml

di.html - działa w IE>=5

Czym jest DTD?

Celem DTD (Document Type Definition) jest definiowanie poprawnie zbudowanych bloków dokumentu XML. Określa ono strukturę dokumentu i listę poprawnych elementów

DTD może być deklarowane bezpośrednio w dokumencie XML lub przez zewnętrzny odnośnik.

Jeżeli DTD jest włączone do pliku źródłowego XML, powinno być opakowane w definicję DOCTYPE o następującej składni:

<!DOCTYPE root-element [element-declarations]>

Przykładowo:

<?xml version="1.0"?>
<!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>

Jeżeli DTD umieszczone jest na zewnątrz pliku źródłowego XML, powinno być opakowane w definicję DOCTYPE o następującej składni:

<!DOCTYPE root-element SYSTEM "filename">

Przykładowo:

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

A to jest kopia pliku "note.dtd" zawierającego DTD:

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

Po co używać DTD?

Deklaracja elementów

Składnia:

<!ELEMENT element-name category>

lub

<!ELEMENT element-name (element-content)>

Zawartość elementu może być określona jako jedna z następujących:

Definiowany element (tytaj element-name) posiada równiez informacje o krotnościach swoich potomków. I tak:

Podnadto element może mieć alternatywnych potomków tzn. potomkiem danego elementu może być jeden z kilku wymienionych na liście. Składnia takiej deklaracji wygląda następująco:

<!ELEMENT element-name (child1,child2,child3,(child4-1|child4-2))>

Elementy mogą mieć też mieszaną zawartość. Rozważmy przykład:

<!ELEMENT note (#PCDATA|to|from|header|message)*>

Deklaracje atrybutów

Składnia:

<!ATTLIST element-name attribute-name attribute-type default-value>

Przy czym typ-atrybutu może przyjąć następujące wartości (podane są tylko te najczęściej stosowane):

A wartosc-domyślna może być jednej z następujących postaci:

Encje

Encje są zmiennymi używanymi do definiowania skrótów do jakiegoś tekstu. Można je deklarować jako wewnętrzne i zewnętrzne.

Oto predefiniowane encje:

&lt;

<

mniejszy niż

&gt;

>

większy niż

&amp;

&

ampersand 

&apos;

'

apostrof

&quot;

"

cudzysłów

Przykład (encja wewnętrzna):

test.xml

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "test.dtd">
<test>
<imie>&imie;</imie>
<nazw>&nazwisko;</nazw>
</test>

test.dtd

<!ELEMENT test (imie,nazw)>
<!ELEMENT imie (#PCDATA)>
<!ELEMENT nazw (#PCDATA)>
<!ENTITY imie "Grzegorz">
<!ENTITY nazwisko "Brzeczyszczykiewicz">

wynik:

Przyklad (encja zewnętrzna):

test2.xml

<?xml version="1.0"?>
<!DOCTYPE test2 SYSTEM "test2.dtd">
<test2>
&incl;
</test2>

test2.dtd

<!ELEMENT test2 (#PCDATA)>
<!ENTITY incl SYSTEM "incl.xml">

incl.xml

<?xml version="1.0"?>
<dane>
Bardzo wazna informacja
</dane>

wynik:

Ograniczenia związane z DTD

Źródła:

  1. Serge Abiteboul, Peter Buneman, Dan Suciu “Dane w sieci WWW”

  2. W3SCHOOLS http://www.w3schools.com/

  3. XMLFILES http://www.xmlfiles.com/