W tej części kursu przekonasz się, że przejście do XML'a z HTML'a, czy
innego języka znacznikowego jest bardzo proste, a nawet jeżeli
z HTML'em nie miałeś do tej pory zbyt wiele wspólnego, nadal XML
okaże się łatwy w opanowaniu.
XML to język znaczników
W XML'u dane przechowywane są w sposób tekstowy, opisywane poprzez znaczniki, w obrębie których
te dane się znajdują. Znacznik rozpoczyna lewy nawias kątowy (
<), a kończy prawy (>). W uproszczeniu można przyjąć, że zestaw znaczników i ich zawartości tworzą dokument
XML, będący najczęściej, ale niekoniecznie, plikiem. Pora na
najbardziej chyba typowy przykład - Hello world, tym razem w XML'u:
Na początku znajduje się prolog dokumentu. W takim prologu umieszcza się
zwykle deklaracje. Może to być standardowa deklaracja XML (pierwsza
linia na listingu powyżej), czy np. deklaracja arkusza stylów.
W linii drugiej rozpoczyna się element główny absolutnie nieodłączna
część każdego dokumentu XML. Ten nazywa się po prostu "przykład" (nazwę elementu
głównego możemy oczywiście ustalić sami), a wewnątrz niego
znajduje się treść "Witaj świecie!". Można powiedzieć, że
jest to jego zawartość tekstowa. Poniżej znajduje się lista tego
wszystkiego, z czego może składać się dokument XML:
Elementy i atrybuty
W związku z tym, że naszła nas nieodparta ochota opisania wyżej wydrukowanej
zawartości tekstowej, chcemy dodać do dokumentu właściwość
o nazwie "typ". Są dwie możliwości. Po pierwsze, można dodać
podelement, po drugie można dodać atrybut. Oto wersja pierwsza:
Według mnie, w tym przypadku bardziej sensowny jest drugi wariant, a
więc użycie atrybutu. W praktyce mógłbyś tworzyć aplikacje
XML posługując się samymi tylko elementami, ale często uzasadnione
będzie użycie właśnie atrybutów. Szczególnie, kiedy jakieś
dane chcesz opisać. Jak taki atrybut wygląda już wiesz. Składa się z nazwy, znaku równości
i ujętej w cudzysłów (pojedynczy, lub podwójny) wartości. Wartość
ta NIE może składać się, podobnie jak tekstowa zawartość elementu,
z nawiasów kątowych (tutaj można jednak użyć nawiasu zamykającego)
no i oczywiście z cudzysłowów. Bezpośrednio nie możesz tam umieścić także
znaku "&". Dlaczego? Dowiesz się jeszcze w tym rozdziale.
Pamiętaj, że w przeciwieństwie do języka HTML, w XML'u wartości atrybutów
musisz ujmować w cudzysłów. Jest tak dlatego, że programy odczytujące
dokumenty XML (parsery) nie muszą znać ich struktury. W związku
z tym składania dokumentów XML musi być bardziej precyzyjna, niż
składnia SGML czy HTML.
Warto jeszcze wspomnieć o rzeczy dla HTML-owców nowej. O pustych elementach. W XML'u każdy
niepusty element musi składać się z pary otwierającej i zamykającej.
Przykładem jest główny element z listingu powyżej. Jeśli element
nie zawiera żadnej zawartości, można oczywiście zastosować element
otwierający i występujący bezpośrednio za nim zamykający, np.:
<Ala ma="kota"></Ala>
ale krótsze będzie użycie właśnie elementu pustego:
<Ala ma="kota"/>
Zwróć uwagę na znak "/" przed nawiasem zamykającym.
Skoro o parach znaczników mowa, to warto jeszcze wspomnieć, że w XML'u rozróżniana jest
wielkość liter. Nieprawidłowy będzie więc kod: "<Ala></ala>". Przy zamykaniu elementów pamiętaj także o zachowaniu struktury dokumentu. Błędne jest
np. coś takiego: "<i><u>ąę</i></u>", za to jak najbardziej poprawne jest: "<i><u>ąę</u></i>". I to tyle.
Sekcje CDATA
Pozwalają włączyć do dokumentu tekst, który ma być zignorowany przez
parser. Jedyne, co parser ma prawo z sekcją CDATA zrobić, to przekazać
jej zawartość. Mogą one więc zawierać nawiasy kątowe i znaki
ampersand, które w "zwykłej" zawartości tekstowej są niedozwolone:
<![CDATA[Hej! to & jest
<właśnie> sekcja cdata.]]>
Jak widać powyżej, sekcję taką rozpoczyna ciąg "<![CDATA[", a kończy "]]>". Ten ostatni jest jedyną niedozwoloną zawartością sekcji. Kiedy parser ją spotka, będzie
oczywiście "myślał", że to koniec sekcji CDATA.
Instrukcje przetwarzania
Są pokrewne sekcjom CDATA, ale lepiej nadają się do "przemycania"
w dokumentach XML np. skryptów. Funkcjonalność instrukcji przetwarzania
jest tym większa, że pozwalają one na identyfikację swojej zawartości,
po prostu poprzez nazwę. Nazwa ta występuje na samym początku,
po znakach "<?" i funkcjonuje dokładnie tak samo, jak nazwa każdego elementu.
<?javascript
alert("To jest <tylko> przykład.");
?>
<?php function printsum($a, $b) {
echo $a + $b;
}
?>
Instrukcja przetwarzania kończy się ciągiem "?>". Zresztą, wspomniana na samym początku tego rozdziału deklaracja XML:
<?xml version="1.0" standalone="yes"?>
również jest instrukcją przetwarzania.
Komentarze
Pozwalają na dodanie uwag widocznych (zwykle) tylko w czasie edycji dokumentu.
Oto przykład:
<!-- <bez> komentarza -->
Komentarz rozpoczyna ciąg "<!--" a kończy "-->". Może on oczywiście zawierać zarówno nawiasy kątowe, jak i znaki
ampersand.
Encje tekstowe
Encje te są czymś w rodzaju szablonów tekstu. Pozwalają uniknąć częstego
wpisywania jakiegoś tekstu a tym samym także pomyłek. To również
najlepszy sposób, na umieszczenie w kodzie "niedozwolonych znaków":
<jakiś.tag> < zostanie przez parser
zastąpione lewym nawiasem kątowym
</jakiś.tag>
Tak, zgadłeś! Ciąg "<" oznacza znak "<". Z kolei znak ">" to ">". Cudzysłów pojedynczy (') to "'",a podwójny (") to """. Znak ampersand (&), to "&". Te pięć encji jest nazwanych predefiniowanymi. Inne znaki możesz cytować
podając ich numer. Bądź to w postaci dziesiętnej, np. "P" wstawi do kodu znak o numerze właśnie 80, bądź heksadecymalnej: "ñ" wstawi znak numer 241.
Jeśli encji chciałbyś użyć do cytowania fragmentu tekstu, musisz
"powiedzieć" parserowi, co dana encja oznacza. Wstawienie poniższego
przykładu sprawi, że ilekroć wpiszesz w tekście ciąg "&adres;", parser zamieni go na mój adres e-mail:
<!ENTITY adres "pawel@pabloware.w.pl">
Tak naprawdę, znacznik "!ENTITY" musi być wstawiony w DTD. Na razie tym się
nie przejmuj, rzecz stanie się jasna, gdy poczytasz o Definicjach
Typu Dokumentu.
Prolog
Prolog nie jest obowiązkową częścią dokumentu. Jeśli można go tam znaleźć, to
na samym jego początku, jeszcze przed elementem głównym. Składa
się z rozmaitych deklaracji (które, jak już wiesz, najczęściej
są jednocześnie instrukcjami przetwarzania). Taką deklaracją
jest np. wspomniana już standardowa deklaracja XML:
<?xml version="1.0"?>
Jedynym jej wymaganym atrybutem jest "version" - wersja, obecnie i
być może już zawsze, będzie ona miała wartość "1.0". Nieobowiązkowymi
atrybutami są: "encoding" - kodowanie znaków (więcej na ten temat
znajdziesz w następnym rozdziale) i "standalone", który określa,
czy dokument jest samodzielny (tzn., czy nie zawiera odwołań do
źródeł zewnętrznych).
O innych deklaracjach dowiesz się, gdy będą omawiane związane z nimi zagadnienia.
Przykładowy dokument
Na koniec pokażę przykładowy dokument XML przechowujący dane osobowe. Będą
tu używane elementy, atrybuty i jeden komentarz:
<!--
Ten przykład zawiera tylko dwa rekordy,
ale może mieć ich tyle, ile jest
miejsca
na dysku :-)
-->
<ludzie>
<człowiek dane="poprawne">
<imie>Paweł</imie>
<nazwisko>Stroiński</nazwisko>
<poczta>pawel@pabloware.w.pl</poczta>
<web>http://www.pabloware.w.pl/</web>
</człowiek>
<człowiek dane="fikcyjne">
<imie>Jan</imie>
<nazwisko>Kowalski</nazwisko>
<poczta>webmaster@kowalski.net</poczta>
<web>http://www.kowalski.net</web>
</człowiek>
</ludzie>
Poniżej ten sam dokument wyświetlony w prostym widoku drzewa: