XML: powrót do źródeł

Coraz częściej w środowiskach związanych z Internetem usłyszeć można nazwę XML. Z tym nowym językiem wiązane są ogromne nadzieje - ma on ponoć zrewolucjonizować wymianę informacji w Internecie i nie tylko... Na wprowadzeniu XML-a skorzystać mają użytkownicy internetowych serwisów informacyjnych, usług e-commerce czy bankowości elektronicznej, a także zwykłego oprogramowania biurowego (wprowadzony właśnie na rynek pakiet Microsoft Office 2000 do zapisu wszystkich tworzonych w nim dokumentów wykorzystuje właśnie standard XML).

Dokładniejsze informacje na temat tego języka są jednak rzadkością - większość zwykłych użytkowników Internetu wciąż jeszcze w ogóle nie wie, "czym się to je". Niniejszy tekst ma za zadanie przynajmniej w części zapełnić tę lukę i zaznajomić Czytelników z podstawowymi koncepcjami XML.

Czym jest XML?

Jednym z częstszych nieporozumień wokół XML-a jest traktowanie tego języka jako czegoś w rodzaju nowego, ulepszonego HTML-a, pozwalającego tworzyć strony WWW o niespotykanych dotychczas możliwościach. Jednak World Wide Web Consortium, organizacja, pod której patronatem stworzono język XML, stwierdza wyraźnie na swoich stronach WWW, że:

Czymże jest zatem i do czego służy XML?

XML (eXtensible Markup Language - rozszerzalny język znaczników) jest uproszczoną wersją opracowanego na początku lat osiemdziesiątych, a oficjalnie przyjętego jako norma ISO w 1986 r. języka SGML (Standard Generalized Markup Language - standardowy język uogólnionych znaczników), służącego do zapisywania złożonych struktur danych w plikach tekstowych. Albo - jak możnaby to ująć inaczej - pozwalającego na umieszczanie w pliku tekstowym dodatkowych informacji odnoszących się do określonych fragmentów tekstu.

Pomysł nie wydaje się być na pierwszy rzut oka niczym nadzwyczajnym. Choćby pierwszy lepszy edytor tekstu zapisuje przecież w tworzonym przez siebie dokumencie oprócz samych znaków tekstu pewne dodatkowe informacje - o kroju i wielkości zastosowanych czcionek, szerokości marginesów, przypisach, końcach akapitów itp. Co prawda zazwyczaj utworzony w ten sposób plik nie ma postaci tekstowej, lecz binarną, charakterystyczną dla konkretnego edytora (np. pliki .DOC Microsoft Worda), istnieją jednakże takie formaty, jak RTF (Rich Text Format), opracowany dla potrzeb wymiany danych między róznymi programami, pozwalający na zapisanie wszystkich tych informacji, odpowiednio zakodowanych, w postaci czystego pliku ASCII.

Istnieje jednak zasadnicza różnica pomiędzy XML-em czy SGML-em a formatami typu RTF. RTF opisuje tekst pod względem wizualnym, nie mówi jednakże nic o znaczeniu poszczególnych jego elementów. Z drugiej strony, SGML i XML stosują podejście wręcz odwrotne: koncentrują się praktycznie wyłącznie na strukturze dokumentu i znaczeniu poszczególnych jego elementów, zupełnie pomijając kwestię tego, jak będzie on wyświetlany - tym steruje zewnętrzny w stosunku do dokumentu arkusz stylów, wiążący każdy element dokumentu z odpowiednimi atrybutami wyświetlania. Oczywiście o ile w odniesieniu do danego typu dokumentu ma to w ogóle sens - pliki SGML/XML nie muszą bowiem reprezentować czytelnego tekstu. Mogą np. opisywać rysunek (w postaci wektorowej) wykonany w programie graficznym, czy zawartość arkusza kalkulacyjnego. Interpretacja danego pliku SGML/XML jest wyłącznie kwestią programu, który będzie go przetwarzał.

Trudno sobie wyobrazić, aby istniał jakiś jeden ustalony format pliku, mogący opisać tak różniące się od siebie klasy danych, jak np. rysunek i faktura za towar. Dlatego zarówno SGML, jak i XML są metajęzykami - czyli zestawem pewnych reguł, pozwalających użytkownikowi tworzyć własne języki opisu określonych klas dokumentów. Nie ma zatem jednego języka XML - jest tyle języków opartych na XML, ile rodzajów dokumentów, które z użyciem tego standardu będziemy opisywać.

No to jak wygląda ten XML?

Bardzo prosto (przynajmniej na początku...). Tak oto może wyglądać najprostszy dokument zapisany w języku XML:

     <BAJKA>
     Jaś i Małgosia poszli do lasu, a tam złapali ich partyzanci.
     </BAJKA>
Jest to całkowicie poprawny formalnie dokument w języku XML, choć oczywiście niezbyt użyteczny - tak prosta struktura nie pozwala dostrzec żadnych korzyści płynących z zastosowania XML. Jednak już w tym dokumencie ujawniają się pewne charakterystyczne cechy składni XML-a. Przede wszystkim - podobnie jak w HTML-u - w XML-u występują znaczniki, ujęte w nawiasy trójkątne "<>". W istocie znaczniki tego rodzaju stanowią podstawowe "klocki" wszystkich języków opartych na SGML-u. W przeciwieństwie jednak do HTML-a, w XML-u wszystkie znaczniki muszą występować parami (z pewnym wyjątkiem, o którym wspomnę dalej): każdemu znacznikowi otwierającemu - w powyższym przykładzie np. <BAJKA> - musi odpowiadać znacznik zamykający (</BAJKA>).

Oczywiście specyfikacja XML-a nie definiuje znacznika <BAJKA> i nie określa jego znaczenia, tak jak specyfikacja HTML-a określa np. znaczniki <P>, <IMG> czy <TABLE>. Istotą XML-a - jak i SGML-a - jest jego uniwersalność: języki te pozwalają użytkownikowi tworzyć całkowicie własne zestawy znaczników, odpowiednie do opisu danego rodzaju dokumentu. I tak w dokumencie reprezentującym rysunek może występować np. znacznik <ODCINEK>, a w fakturze - znacznik <CENA>.

Para odpowiadających sobie znaczników wraz z zawartą pomiędzy nimi treścią nazywa się elementem. Elementy stanowią podstawowe bloki, z których budowane są dokumenty XML. Elementy mogą zawierać w sobie inne elementy - należy jednak zwrócić uwagę, że element wewnętrzny musi się wówczas całkowicie zawierać w zewnętrznym! Przykładowo, spotykana nierzadko na stronach WWW konstrukcja typu

     <B><I>Ten tekst jest pogrubiony i pochyły.</B></I>
jest niepoprawna z punktu widzenia XML-a (ściśle rzecz biorąc, jest ona formalnie niepoprawna także z punktu widzenia specyfikacji HTML-a, jednak akceptowana przez przeglądarki) - elementy <B>...</B> i <I>...</I> są "skrzyżowane". Richard Light w swojej książce "Presenting XML" porównuje elementy do walizek - można włożyć całą jedną walizkę w drugą, ale nie można włożyć jednej walizki do drugiej częściowo, a częściowo pozostawić jej na zewnątrz! Aby powyższy fragment dokumentu zapisać poprawnie, jedna para znaczników musi zatem całkowicie zawierać się wewnątrz drugiej, a więc np.:

     <B><I>Ten tekst jest pogrubiony i pochyły.</I></B>
albo
     <I><B>Ten tekst jest pogrubiony i pochyły.</B></I>
Cały dokument XML musi stanowić jeden element, czyli musi być ujęty w pojedynczą parę znaczników. Tak więc poniższy tekst nie jest poprawnym dokumentem XML, ponieważ występują w nim dwa elementy, jeden po drugim:

     <BAJKA>
     Jaś i Małgosia poszli do lasu, a tam złapali ich partyzanci.
     </BAJKA>
     <MORAŁ>
     Nie chodź do lasu w czasie wojny.
     </MORAŁ>
Możemy jednak uczynić z niego poprawny dokument, jeżeli ujmiemy go w jeszcze jedną, zewnętrzną parę znaczników:

     <OPOWIASTKA>
     <BAJKA>
     Jaś i Małgosia poszli do lasu, a tam złapali ich partyzanci.
     </BAJKA>
     <MORAŁ>
     Nie chodź do lasu w czasie wojny.
     </MORAŁ>
     </OPOWIASTKA>
W znacznikach XML-a rozróżniane są duże i małe litery - tak więc, jeżeli znacznik otwierający został zapisany jako <BAJKA>, to znacznik zamykający musi być zapisany jako </BAJKA>, a nie </bajka>. Jest to sytuacja odmienna od występującej w HTML-u, gdzie np. blok tekstu pogrubionego rozpoczęty znacznikiem <B> mógł być zakończony znacznikiem </b>. W XML-u znaczniki takie jak np. <BAJKA>, <bajka> i <Bajka> traktowane są jako początki trzech zupełnie różnych elementów, które mogą nawet być zawarte jeden w drugim:

     <Bajka>
     <BAJKA>
     Jaś i Małgosia poszli do lasu, a tam złapali ich partyzanci.
     </BAJKA>
     <bajka>
     Nie chodź do lasu w czasie wojny.
     </bajka>
     </Bajka>
Zajmowaliśmy się dotąd elementami, czyli parą znaczników - otwierającym i zamykającym - z zawartą pośrodku treścią. Do przekazania niektórych rodzajów informacji może jednak wystarczyć pojedynczy "samotny" znacznik, nie wymagający znacznika zamykającego i żadnej dodatkowej treści. Przykładem może tu być np. HTML-owy znacznik <BR>, oznaczający przejście do nowego wiersza w miejscu, w którym występuje on w tekście. Takie "samotne" znaczniki w XML-u muszą być zapisywane nieco inaczej:

     <BR/>
Znak "/" tuż przed końcowym nawiasem znacznika informuje, że dany znacznik nie ma znacznika zamykającego, lecz stanowi samoistną całość. W formalnym opisie składni XML-a znacznik taki jest traktowany jako tzw. element pusty.

Podobnie jak w HTML-u, także i w XML-u znaczniki mogą posiadać atrybuty, czyli dodatkowe informacje opisujące element:

     <CYTAT AUTOR="A.Mickiewicz">Litwo, ojczyzno moja!</CYTAT>

     <CENA TYP="netto" WALUTA="USD">29.95</CENA>

     <ODCINEK POCZĄTEK="0,0" KONIEC="300,170" KOLOR="czerwony"/>
Wartości atrybutów muszą być zawsze ujęte w cudzysłowy.

Główna część dokumentu XML może być poprzedzona tzw. prologiem, choć specyfikacja języka nie wymaga jego obecności. Prolog składać się może z dwóch części: deklaracji XML oraz definicji typu dokumentu (DTD). Deklaracja XML sygnalizuje, że dokument napisany jest właśnie w języku XML, a nie w "czystym" SGML - może to być istotne np. w przypadku przetwarzania dokumentu przez program obsługujący obydwa te języki, ponieważ istnieją między nimi pewne różnice. Zaleca się zatem umieszczanie jej na początku dokumentu, pomimo iż formalnie nie jest to wymagane:

     <?xml version="1.0"?>
Definicja typu dokumentu (DTD) jest chyba najbardziej skomplikowaną częścią całego języka, stąd też nie będziemy się na razie nią zajmować. Warto jednak zdawać sobie sprawę, że to właśnie DTD stanowi tak naprawdę istotną siłę zarówno SGML-a, jak i XML-a. To właśnie DTD służy do budowy na bazie XML-a konkretnych języków, opisujących konkretne klasy dokumentów. Definicja typu dokumentu określa bowiem, jakie elementy mogą wystąpić w jego treści, w jakim porządku i w jakie atrybuty mogą one być zaopatrzone. W przeciwieństwie jednak do SGML-a, gdzie każdy dokument musi posiadać DTD, specyfikacja XML-a pozwala na jej pominięcie. Z tego punktu widzenia rozróżnia się dwa rodzaje dokumentów XML - formalnie poprawne (well-formed) i prawidłowe (valid).

Dokumenty formalnie poprawne nie mają DTD: mogą w nich zatem występować dowolne elementy i w dowolnym porządku, wymagana jest jedynie zgodność z podanymi powyżej ogólnymi regułami składni XML-a. W dokumentach prawidłowych nazwy, atrybuty i porządek wystąpienia poszczególnych elementów muszą być zgodne z określoną w prologu dokumentu DTD. Stworzenie prawidłowego dokumentu XML jest zatem trudniejsze niż tylko formalnie poprawnego - główna trudność polega na napisaniu DTD. Praca zainwestowana w stworzenie DTD dla określonej klasy dokumentów - np. faktur - szybko się jednak zwraca, gdy takich dokumentów mamy większą ilość. Wówczas w oparciu o raz napisaną definicję typu możemy szybko tworzyć podobne dokumenty, a przetwarzający je program łatwo sprawdzać ich poprawność. (Więcej o definicjach typu dokumentu można przeczytać obok).

Po co to wszystko?

Przedstawione dotychczas informacje na temat języka XML niekoniecznie brzmią przekonująco, jeżeli chodzi o jego użyteczność. Podane przykłady mogą raczej sprawiać wrażenie czysto formalnej zabawy, "sztuki dla sztuki", ciekawej, ale zupełnie nieprzydatnej. Wróćmy jeszcze raz do naszego pierwszego przykładu (tym razem uzupełnionego o deklarację XML):

     <?xml version="1.0"?>
     <BAJKA>
     Jaś i Małgosia poszli do lasu, a tam złapali ich partyzanci.
     </BAJKA>
Cóż wynika z tego, że fragment tekstu ujęliśmy w parę znaczników? Oczywiście na razie nic, ale dołóżmy tych znaczników trochę więcej:

     <?xml version="1.0"?>
     <BAJKA>
     <OSOBA>Jaś</OSOBA> i <OSOBA>Małgosia</OSOBA> <CZYNNOŚĆ>poszli</CZYNNOŚĆ>
     do <MIEJSCE>lasu</MIEJSCE>, a tam <CZYNNOŚĆ>złapali</CZYNNOŚĆ> ich
     <ORGANIZACJA TYP="militarna">partyzanci</ORGANIZACJA>.
     </BAJKA>
Oto podstawowa idea języków SGML i XML - dokument samoobjaśniający się! Wyświetlenie obydwu powyższych dokumentów na ekranie przez odpowiednią "przeglądarkę" mogłoby dać taki sam efekt, ale możliwości manipulacji informacją zawartą w drugim dokumencie są daleko większe. Na podstawie oznakowanego w taki sposób tekstu można np. automatycznie wygenerować listę osób, o których jest mowa w treści, albo odnaleźć ten fragment w większej całości w oparciu o kryterium, że ma być w nim mowa o organizacji militarnej - chociaż słowa "organizacja" ani "militarna" nie pojawiają się w sposób jawny na ekranie!

Autor np. książki naukowej, przygotowujący - za pomocą odpowiednich narzędzi edytorskich - tekst w formacie SGML i umieszczający w nim tego typu oznakowania zyskuje z jednej strony możliwość automatycznego wygenerowania skorowidzów nazw i pojęć występujących w książce według poszczególnych kategorii - np. nazwisk, nazw geograficznych, pojęć z zakresu wojskowości - z drugiej zaś, stosując odpowiednie znaczniki dla takich elementów jak rozdział, podrozdział, przypis, notka w ramce czy na marginesie, możliwość nadania im przy drukowaniu - poprzez sterujący wydrukiem zewnętrzny arkusz stylów - jednolitego w całej książce wyglądu, z równoczesną możliwością łatwej jego zmiany w razie np. zmiany formatu książki czy koncepcji graficznej wydawcy. Ogromne usługi może oddać SGML w tworzeniu np. encyklopedii bądź skomplikowanych dokumentacji technicznych, albo w redakcjach wielkich gazet czy agencjach prasowych, przy przeszukiwaniu ich pełnotekstowych archiwów. Tu właśnie ujawnia się kluczowa rola definicji typu dokumentu: napisanie DTD dla tego typu dokumentów to w istocie opracowanie wykazu kategorii informacji, które będziemy chcieli wyróżniać w tekście; ich ewentualne uszczegółowienie i podział na podkategorie poprzez dodanie atrybutów; wreszcie określenie ewentualnych zależności między różnymi kategoriami. Opierając się na tak przygotowanej DTD, oprogramowanie redakcyjne może w znakomity sposób wspierać użytkownika tworzącego dokument w półautomatycznym wprowadzaniu odpowiednich znaczników, weryfikując przy tym od razu, które z nich - zgodnie z DTD - mogą w danym miejscu się pojawić.

Dlaczego XML?

Zalety SGML-a sprawiły, że w opisanych powyżej zastosowaniach - np. tworzeniu dokumentacji technicznej - język ten wykorzystywany był już od dawna, praktycznie od chwili jego pojawienia się. Po co zatem stworzono nowy język - czy nie wystarczył już istniejący?

Przy wszystkich jego zaletach, podstawową wadą "klasycznego" SGML-a jest jego ogromna złożoność. Składnia definicji typu dokumentu tworzonych w języku SGML wprowadza szereg bardzo zawikłanych, a zarazem rzadko wykorzystywanych możliwości. Pociągało to za sobą wysokie skomplikowanie, a co za tym idzie, najczęściej również wysoką cenę oprogramowania pozwalającego na tworzenie i przetwarzanie dokumentów zapisanych w "pełnym" SGML-u. O ile użycie takiego oprogramowania było opłacalne i uzasadnione w przypadku manipulowania wielkimi ilościami informacji (wydawnictwa, wielkie koncerny, urzędy państwowe), to zupełnie nieakceptowalne w sytuacji, gdy skorzystać z SGML-a potrzebowałby przeciętny użytkownik Internetu czy aplikacji biurowych. Naprzeciw takiej właśnie potrzebie chcieli wyjść projektanci XML-a - w pierwszym spośród dziesięciu założeń projektowych tego języka zapisano, że ma on być możliwy do łatwego wykorzystania w zastosowaniach związanych z przesyłaniem informacji przez Internet. Cel ten osiągnięto, usuwając z SGML-a - przy zachowaniu jego podstawowych idei - wszystkie owe skomplikowane, rzadko używane opcje. Powstał język, który - cytując wspomnianego już Richarda Lighta, autora książki "Presenting XML" - "daje 80 procent możliwości SGML-a przy 20 procentach jego złożoności".

Po co jednak przeciętnemu użytkownikowi Internetu miałyby być potrzebne możliwości SGML-a? Aby odpowiedzieć na to pytanie, spójrzmy nieco wstecz, ku początkom języka HTML.

Granice HTML-a

Zewnętrzne podobieństwo XML-a i HTML-a, na które kilkakrotnie zwracałem uwagę powyżej, nie jest niczym dziwnym. Kiedy Tim Berners-Lee tworzył w początkach lat dziewięćdziesiątych podstawy koncepcji WWW, w poszukiwaniu języka, w którym miałyby być tworzone dokumenty prezentowane w tym systemie, zwrócił się właśnie w stronę SGML-a. Język HTML jest w istocie tzw. aplikacją SGML-a, czyli konkretną definicją typu dokumentu, określającą oparty na SGML-u szczegółowy język. Formalnie rzecz biorąc, standard języka HTML wymaga, aby na początku dokumentu wyspecyfikowana była DTD, odpowiadająca wersji HTML-a, w której strona jest zapisana. Przykładowo, dla HTML-a 3.2 odpowiedni zapis powinien brzmieć:

     <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
Przeglądarki WWW wprawdzie ignorują ten wpis, interpretując strony nie na podstawie DTD, lecz w sposób "naiwny", w oparciu o wbudowane reguły określające działanie poszczególnych znaczników, jednak jeśli zechcemy np. przetwarzać stronę narzędziami obsługującymi SGML, obecność DTD jest niezbędna.

Początkowo HTML zaprojektowany został dla prezentacji ograniczonej klasy stosunkowo prostych dokumentów, składających się z akapitów tekstu, poprzedzonych nagłówkami różnych poziomów (np. tytułami rozdziałów, podrozdziałów itp.) i przetykanych od czasu do czasu ilustracjami. W treści dokumentu mogło pojawić się kilka podstawowych struktur logiczno-typograficznych - takich jak np. wyliczenia, i... właściwie niewiele więcej. Było to wystarczające do prostych, krótkich tekstów informacyjnych, zdecydowanie nie wystarczało jednak dla bardziej zaawansowanych dokumentów, ani o charakterze naukowym, ani biznesowym (brak np. elementów takich jak tabelki czy wzory matematyczne). Niektóre z tych braków uzupełnione zostały w późniejszych wersjach języka.

Pierwotny HTML był językiem niemal czysto strukturalnym - opisywał formalne struktury, z jakich składa się dokument: akapity, nagłówki, wyliczenia... Sposób przedstawienia tych struktur na ekranie - zgodnie z ideą SGML-a - był pozostawiony oprogramowaniu wyświetlającemu; widać to wyraźnie w legendarnej NCSA Mosaic - pierwszej graficznej przeglądarce WWW - gdzie użytkownik mógł np. dowolnie ustalić krój, wielkość i inne atrybuty czcionki dla każdego z nagłówków <H1> ... <H6>. Już jednak ten pierwotny HTML zawierał pewne znaczniki o charakterze prezentacyjnym, czyli sugerujące jak dokument ma wyglądać - np. <B> i <I> (choć zamiast nich preferowane były "logiczne" znaczniki <STRONG> i <EM>, dziś już chyba prawie przez nikogo nie używane). W toku błyskawicznego rozwoju WWW i toczących się "wojen przeglądarek", pod wpływem głosów projektantów stron, domagających się większych możliwości kontroli nad ich formą graficzną (por. artykuł wstępny z MI 1/99), tych elementów prezentacyjnych dodawano do HTML-a coraz więcej, coraz bardziej przy tej okazji odchodząc od oryginalnej SGML-owej koncepcji języka. Producenci przeglądarek nie zadawali sobie przy tym rzecz jasna trudu, aby dodając w przeglądarce obsługę nowych znaczników i atrybutów, stworzyć formalną specyfikację tych możliwości w postaci odpowiedniej DTD; zresztą po co, skoro przeglądarki WWW nie analizują stron w oparciu o DTD? Byle się ładnie wyświetlało... (Historię sporu między dwoma podejściami do HTML-a - "strukturalnym" i "graficznym" znakomicie opisał David Siegel w swojej książce "Creating Killer Web Sites", wydanej niedawno w Polsce pod tytułem "Tworzenie stron WWW".)

Obecnie HTML, wsparty przez kaskadowe arkusze stylów (CSS) i język JavaScript, pod względem wizualnym pozwala zrobić już niemal wszystko. W tym momencie społeczność internetowa dostrzegła inną ułomność HTML-a, na którą wcześniej w ogniu "wojen przeglądarek" nie zwracała uwagi: wręcz znikome możliwości klasyfikowania i przetwarzania treści prezentowanych na stronach WWW. W HTML-u mamy obecnie pozostałe z pierwotnej koncepcji znaczniki strukturalne, mamy mnóstwo znaczników prezentacyjnych, nie mamy natomiast tego, co stanowi istotę SGML-a - znaczników odnoszących się do sensu zawartych w dokumencie informacji. Jak powiedział słynny informatyk, jeden z twórców języka programowania C, Brian Kernighan, parafrazując określenie WYSIWYG ("widzisz to, co otrzymasz") - w HTML-u "otrzymujesz tylko to, co widzisz". Tak właśnie powstała potrzeba stworzenia języka takiego, jak XML.

XML i HTML

Wyobraźmy sobie, że dysponujemy adresem jakiejś stale aktualizowanej strony WWW, przedstawiającej bieżące kursy walut (strona ta może wyglądać np. tak, jak na rysunku obok). Dane z tej strony chcemy wykorzystać w programie, który opierając się na publikowanych kursach będzie np. przeliczał marki na dolary.

Zadanie to nie jest wcale proste. Kod HTML odpowiadający pokazanemu na rysunku fragmentowi strony może wyglądać np. tak:

     <table bgcolor="#E0D8A0" border="1" cellpadding="5">
     <tr><th colspan="2" align="center">
     <font color="#E00000">Kursy walut z dnia 01.10.1999</font>
     </th></tr>
     <tr><td><b>1 USD</b></td><td>
     <font color="#0000E0">4,0662 zł</font></td></tr>
     <tr><td><b>1 GBP</b></td><td>
     <font color="#0000E0">6,7184 zł</font></td></tr>
     <tr><td><b>1 DEM</b></td><td>
     <font color="#0000E0">2,2364 zł</font></td></tr>
     <tr><td><b>1 FRF</b></td><td>
     <font color="#0000E0">0,6668 zł</font></td></tr>
     </table>
Ta plątanina liczb i liter nie zawiera żadnej wskazówki, na podstawie której program mógłby łatwo wyłowić akurat te liczby, które nas interesują. Możemy mu oczywiście wskazać "na sztywno", z którego miejsca strony (z której komórki tabeli) ma pobierać dane - jednak w takiej sytuacji każda zmiana układu graficznego strony przez jej autora owocuje bezużytecznością naszego programu, który trzeba przerabiać, wskazując mu nową lokalizację danych.

W tym kontekście XML stanowi "powrót do źródeł" - do najwcześniejszej koncepcji SGML-a, skupiającej się jedynie na strukturze dokumentu, a pomijającej wszelkie kwestie prezentacyjne. Powyższy dokument z kursami walut zapisany w języku XML mógłby wyglądać na przykład tak:

     <?xml version="1.0"?>
     <GIEŁDA>
     <TYTUŁ>Kursy walut z dnia <DATA>01.10.1999</DATA></TYTUŁ>
     <KURS WALUTA="USD">4,0662</KURS>
     <KURS WALUTA="GBP">6,7184</KURS>
     <KURS WALUTA="DEM">2,2364</KURS>
     <KURS WALUTA="FRF">0,6668</KURS>
     </GIEŁDA>
Dokument taki mógłby zarówno być wyświetlony przez przeglądarkę "rozumiejącą" język XML, być może w postaci tabelki podobnej do pokazanej powyżej (w tym celu niezbędne byłoby zaopatrzenie przeglądarki w odpowiedni arkusz stylów, określający, jak należy wyświetlać elementy typu <TYTUŁ> czy <KURS>), jak i bez problemu wczytany do programu przeliczającego kursy, który niezależnie od liczby i kolejności uwzględnionych w dokumencie walut nie miałby żadnych trudności ze zidentyfikowaniem wartości np. kursu dolara na podstawie odpowiadającego mu znacznika.

Przykład ten pokazuje, że XML i HTML operują na dwóch zupełnie różnych poziomach abstrakcji. Trudno zatem mówić o jakiejś bezpośredniej "konkurencji" między nimi i "wypieraniu" HTML-a przez XML, jak to tu i ówdzie się słyszy. Wręcz przeciwnie, możliwe jest - a nawet należało tego oczekiwać - stworzenie XML-owej wersji HTML-a, swego rodzaju "hybrydy" tych dwu języków, którą interpretować będą przyszłe przeglądarki WWW. "Hybryda" taka istotnie powstała - 24 sierpnia 1999 World Wide Web Consortium ogłosiło pierwszą wersję specyfikacji języka XHTML, powstałą w wyniku przekształcenia istniejących definicji typu dokumentu dla języka HTML 4.0 z SGML-a na XML. Specyfikacja ta jest jeszcze niedoskonała i nie umożliwia wykorzystania w nowym języku pełnego zakresu możliwości XML-a - w szczególności łatwego wprowadzania własnych znaczników. Pod względem możliwości XHTML jest na razie praktycznie identyczny z HTML-em 4.0, różnica polega jedynie na tym, że jego DTD zapisana jest w postaci odpowiadającej składni XML-a, a nie SGML-a. W3C cały czas jednak pracuje nad jego rozszerzeniem i ulepszeniem.

Nie musimy jednak czekać na W3C; korzystając z faktu, że dokumenty w XML-u nie muszą mieć DTD, a obecne przeglądarki WWW wciąż jeszcze interpretują HTML "naiwnie", bez opierania się na DTD, możemy "krzyżować" HTML-a z XML-em na własny użytek już teraz. Wróćmy jeszcze raz do pierwszej, HTML-owej wersji podanej powyżej tabelki z kursami. Ponieważ przeglądarki WWW ignorują znaczniki, których nie znają (jest to efekt wspomnianej wcześniej "naiwnej" interpretacji), możemy bez kłopotu uzupełnić tabelkę o umieszczone wokół właściwych liczb nasze XML-owe znaczniki <KURS>:

     <table bgcolor="#E0D8A0" border="1" cellpadding="5">
     <tr><th colspan="2" align="center">
     <font color="#E00000">Kursy walut z dnia 01.10.1999</font>
     </th></tr>
     <tr><td><b>1 USD</b></td><td>
     <font color="#0000E0"><KURS WALUTA="USD">4,0662</KURS> zł
     </font></td></tr>
     <tr><td><b>1 GBP</b></td><td>
     <font color="#0000E0"><KURS WALUTA="GBP">6,7184</KURS> zł
     </font></td></tr>
     <tr><td><b>1 DEM</b></td><td>
     <font color="#0000E0"><KURS WALUTA="DEM">2,2364</KURS> zł
     </font></td></tr>
     <tr><td><b>1 FRF</b></td><td>
     <font color="#0000E0"><KURS WALUTA="FRF">0,6668</KURS> zł
     </font></td></tr>
     </table>
Taki dokument zostanie poprawnie wyświetlony przez zwykłą przeglądarkę WWW, a zarazem wczytanie go do jakiegokolwiek programu "rozumiejącego" XML pozwoli na automatyczne wyodrębnienie z tekstu interesujących nas wartości kursów. Przy przekształacaniu dokumentu HTML na XML musimy jednak pamiętać o kilku regułach, które dokładniej przedstawiamy obok.

XML i co dalej?

Pomimo że XML główny nacisk kładzie na strukturę i treść dokumentu, to jako że język ten projektowany był do zastosowań w Internecie, nie może pomijać aspektów prezentacyjnych, ani też kwestii hiperpołączeń między dokumentami. Tymi aspektami dokumentów zajmują się dwa języki, towarzyszące XML-owi i uzupełniające go: XLL (eXtensible Link Language, zwany także Xlink), opisujący sposób tworzenia w XML-u powiązań pomiędzy dokumentami, i XSL (eXtensible Stylesheet Language), służący do definiowania skojarzonych z dokumentami XML arkuszy stylów.

Odsyłacze w XLL są znacznie bardziej rozbudowane niż proste odsyłacze HTML-a. Po pierwsze, mają cały szereg atrybutów, które pozwalają określić sposób "zachowania się" odsyłacza: czy dokument, do którego prowadzi odsyłacz, będzie pojawiał się w tym samym oknie przeglądarki, czy też otwierane będzie nowe okno, i jeżeli tak, to jaki będzie np. jego rozmiar; czy uaktywnienie odsyłacza dokonywane będzie ręcznie przez użytkownika, czy też przejście do nowego dokumentu nastąpi automatycznie, np. po określonym czasie; itd. Pozwala to na uzyskanie efektów, które dotychczas - w HTML-u - wymagały zastosowania języka JavaScript. Możliwe jest tworzenie odsyłaczy, które prowadzą do więcej niż jednego dokumentu; po uaktywnieniu takiego odsyłacza przeglądarka prezentowałaby wykaz dokumentów, do których odsyłacz prowadzi (każdemu dokumentowi można przypisać odpowiedni komentarz), i dawałaby użytkownikowi możliwość wyboru jednego (lub kilku) z nich. Możliwe jest wreszcie tworzenie tzw. grup połączonych dokumentów; przy otwarciu w przeglądarce dowolnego spośród takich połączonych dokumentów wyświetlana jest (np. w osobnym oknie) lista wszystkich dokumentów należących do grupy, za pomocą której w każdej chwili można przenieść się do któregokolwiek z pozostałych dokumentów. Przykładowy opis takiej grupy dokumentów w tekście strony może wyglądać np. tak:

     <elink xml:link="extended" role="annotation">
     <locator xml:link="locator" href="art.xml">Tekst artykułu</locator>
     <locator xml:link="locator" href="polemika.xml">Polemika</locator>
     <locator xml:link="locator" href="odp.xml">Odpowiedź autora</locator>
     <locator xml:link="locator" href="listy.xml">Listy czytelników</locator>
     </elink>
Co do XSL, w koncepcji raczej niewiele się on różni od innych języków służących do tworzenia arkuszy stylów, takich jak CSS (Cascading Style Sheets), stosowany w obecnych przeglądarkach WWW, czy używany w systemach SGML-owych DSSSL (Document Style and Semantics Specification Language). Od języków tych odróżnia się XSL faktem, iż jest on także aplikacją XML-a, a więc jego składnia jest spójna ze składnią dokumentu, którego dotyczy, podczas gdy CSS i DSSSL mają własną, nie mającą nic wspólnego z SGML-em, składnię. Podobnie jak te języki, XSL służy do określania sposobu wyświetlania każdego zawartego w dokumencie elementu, umożliwiając zdefiniowanie atrybutów takich jak np. krój i wielkość czcionki, pogrubienie, kolor tekstu itp. Pewne elementy tekstu mogą być traktowane jako niewidoczne bądź wyświetlane tylko przy spełnieniu określonych warunków. Określonym klasom elementów (np. <KURS> czy <P>) można przypisać pewne domyślne style, oprócz tego rzecz jasna poszczególnym elementom można indywidualnie przypisywać dowolny styl.

Zastosowania

Na koniec wypada odpowiedzieć na pytanie - jak to wszystko wygląda w praktyce? XML jest stosunkowo nową technologią i wykorzystujące go narzędzia dopiero powstają, niemniej jednak wskazać można już przynajmniej kilka praktycznych zastosowań, w których wykorzystywany jest XML. Chyba pierwszym szeroko znanym zastosowaniem XML-a były pliki CDF (Channel Definition Format), opisujące tzw. kanały informacyjne, wprowadzone przez Microsoft w przeglądarce Internet Explorer 4.0. Jedną z bardziej znanych aplikacji XML-a jest również SMIL (Synchronized Multimedia Integration Language), język służący do opisu prezentacji multimedialnych, obsługiwany przez program RealPlayer G2. Wspomniałem już na wstępie artykułu o pakiecie Microsoft Office 2000, który zapisuje wszystkie dokumenty na dysk w formacie XML.

Niektóre przeglądarki WWW zapewniają już - choć na razie jeszcze w ograniczonym zakresie - obsługę XML-a: ma ją np. piąta wersja Internet Explorera, a także Mozilla (http://www.mozilla.org/) - tworzona na zasadach open-source przeglądarka oparta na kodzie udostępnionym przez Netscape'a. W oparciu o tę ostatnią powstała też przeglądarka DocZilla (http://www.doczilla.com/), interpretująca zarówno XML, jak i pełny SGML. Dostępnych jest coraz więcej edytorów wspierających tworzenie plików XML i SGML, poczynając od najprostszych, jak dostępny za darmo na stronach Microsoftu XML Notepad, po zaawansowane narzędzia przeznaczone dla profesjonalistów, jak XMetaL firmy SoftQuad. Z pewnością ich liczba będzie rosła...

Wszyscy zainteresowani XML-em mogą znaleźć więcej informacji na stronie WWW pod adresem http://www.geocities.com/SiliconValley/Peaks/5957/xml.html, będącej chyba najlepszym zbiorem odsyłaczy do różnych materiałów w Internecie poświęconych tematyce XML-a i SGML-a. Wśród nich warto oczywiście szczególnie polecić oficjalne strony World Wide Web Consortium pod adresem http://www.w3.org/XML/. Wiele ciekawych informacji znaleźć można też na stronach Microsoftu: http://msdn.microsoft.com/xml/.


Jarosław Rafa 1999. Tekst udostępniony na licencji Creative Commons (uznanie autorstwa - użycie niekomercyjne - bez utworów zależnych). Kliknij tutaj, aby dowiedzieć się, co to oznacza i co możesz z tym tekstem zrobić. W razie jakichkolwiek wątpliwości licencyjnych bądź w celu uzyskania zgody na rozpowszechnianie wykraczające poza warunki licencji proszę o kontakt e-mailem: raj@ap.krakow.pl.

Wersja HTML opracowana 25.11.99.


Powrót do wykazu artykułów o Internecie Statystyka