XML nie jest sposobem tworzenia stron WWW.
XML kojarzy się z HTML a jego rozwojem zajmuje się ta sama organizacja z Web w nazwie. Pośrednio XML-a używa wiele technologii i narzędzi związanych z WWW (np. XHTML jest zastosowaniem XML), jednak nie należy łączyć bardzo ogólnego standardu XML z tym jednym zastosowaniem.
XML nie jest sposobem prezentacji.
Chociaż do prezentacji służą niektóre jego zastosowania (XHTML, XSL), a dane zapisane w XML można wizualizować za pomocą m.in. XSL i CSS.
XML nie jest językiem programowania.
Chociaż z programowaniem wiążą się niektóre jego zastosowania (np. WSDL i SOAP). Ponadto można wymyślić język programowania w składni XML – w pewnym sensie taką rolę pełni XSLT.
Zasadniczo XML służy do przechowywania lub przesyłania danych tekstowych wraz z ich strukturą. Konkretne zastosowania XML mogą służyć bardziej specyficznym celom.
Dokumenty XML, jako zwykłe pliki tekstowe, można edytować w najprostszych edytorach. Oczywiście istnieją także wyspecjalizowane programy znacznie ułatwiające tą pracę i obsługujące związane z XML standardy.
Z danych zapisanych w postaci XML można korzystać w programach, używając bogatych bibliotek do parsowania, przetwarzania i zapisywania XML oraz do obsługi standardów związanych z XML.
Dane zapisane w XML można dość łatwo przekształcać do innych formatów tekstowych, np. w celu ich prezentacji. Służy temu m.in. standard XSLT.
Do edycji dokumentów XML, w tym także XML Schema czy XSLT, teoretycznie ożna użyć dowolnego edytora tekstu typu Notatnik. Edytory dla programistów (vim, Emacs, gedit, kate, Notepad++ i setki innych) dają dodatkowe wsparcie od kolorowania składni wzwyż.
Osobiście polecam środowisko Eclipse, to samo którego używamy dla Javy. Należy użyć wersji "for Java EE Developers" lub do wersji minimalnej doinstalować wtyczki z rodziny Web Tools Platform i ewentualnie Eclipse Modelling Framework. Obciążenia Eclipse'a („kobyła”, aby wygodnie pracować trzeba zakładać projekty, ...) są rekompensowane przez bardzo dobre obecnie wsparcie dla XML, XML Schema czy XSLT.
Istnieją także komercyjne narzędzia do XML, z których warto zwrócić uwagę na Altova XML Spy, stosowany niegdyś na tych zajęciach, Oxygen czy XMetal. Posiadają one darmowe wersje próbne.
Przeglądarki internetowe parsują podany dokument XML, sprawdzając m.in. poprawność przestrzeni nazw, i wyświetlają go „jakoś”.
Pod Linuksem działa program xmllint, parsujący dokumenty XML. Następujące wywołanie:
xmllint -noout plik.xmlsprawdzi poprawność pliku nie wypisując go na ekran.
xmllint -valid -noout plik.xmlwaliduje dokument.
Dokument XML można interpretować na różnych poziomach abstrakcji. Dokument jest ciągiem znaków, jest ciągiem znaczników i tekstu, jest drzewem. Zacznijmy od najwyższego poziomu abstrakcji.
Na najwyższym poziomie abstrakcji dokument jest drzewem, w którym występują węzły elementów i węzły tekstowe. Węzeł tekstowy (text node) jest zawsze liściem drzewa. W dokumencie istnieje dokładnie jeden element główny.
Element ma swoją nazwę, może posiadać dzieci (elementy i węzły tekstowe). Wśród dzieci jednego węzła mogą powtarzać się elementy o takich samych nazwach. Element może posiadać atrybuty.
Atrybut (attribute) jest identyfikowany przez nazwę, jego wartością jest tekst. Jeden element nie może posiadać dwóch atrybutów o tej samej nazwie.
Istnieją dodatkowe typy węzłów, w których zapisywane są informacje nie będące właściwą treścią dokumentu, ale które powinny się w dokumencie znaleźć, są nimi komentarze i instrukcje przetwarzania.
Instrukcja przetwarzania (processing instruction) zawiera dodatkowe informacje skierowane do programów odczytujących dany dokument. Instrukcja składa się z podmiotu (target) oraz treści. Istnieje konwencja zapisywania treści instrukcji tak, jak zapisuje się atrybuty i ich wartości w elementach, ale nie jest to wymagane przez standard XML.
Komentarz (comment) to komentarz :). Komentarze i instrukcje przetwarzania mogą występować w dokumencie także na zewnątrz elementu głównego.
Opisane dotąd typy węzłów występują w modelu dokumentu XML określonym przez standard XPath, są uznawane za warstwę logiczną dokumentu XML.
Warstwa fizyczna dokumentu XML oparta jest o pojęcie encji (entity). Encja to spójny ciąg znaków, uogólnione pojęcie pliku (dane mogą pochodzić nie tylko z pliku, ale np. z sieci czy innych aplikacji).
W XML występuje 5 predefiniowanych encji, służących zapisywaniu w treści dokumentu znaków specjalnych:
&
– &
<
– <
>
– >
"
– "
'
– '
Inne encje mogą zostać zadeklarowane w DTD. W dokumencie mogą występować referencje do encji, np.
&encja;
. Program czytający XML powinien wstawić w to miejsce (w warstwie logicznej) sparsowaną zawartość encji.
Oprócz referencji do encji istnieją referencje do znaków, np. ü
to odwołanie do znaku ü o kodzie
Unicode 252, a €
do znaku o kodzie 128 (0x0080). Podczas odczytywania dokumentu aplikacja powinna
wstawić (w warstwie logicznej) znak opisywany przez referencję do odpowiedniego węzła tekstowego lub wartości atrybutu.
Sekcje CDATA pozwalają na zapisywanie w węzłach tekstowych znaków specjalnych bez stosowania
referencji do znaków czy encji. Jedynym zabronionym w sekcji CDATA ciągiem znaków jest ]]>
, który
zawsze zamyka sekcję. Ten ciąg znaków jest także zabroniony w zawartości tekstowej dokumentu XML.
Na początku dokumentu może występować deklaracja XML, która służy do podania wersji standardu XML i standardu kodowania użytego do zapisania dokumentu. Jeśli dokument XML 1.0 jest zapisany w UTF-8, deklarację XML można pominąć.
Na początku dokumentu, ale za deklaracją XML (jeśli występuje) może występować deklaracja DTD (Document Type Definition). Jest to jeden ze sposobów na określenie typu dokumentu, obecnie nieco przestarzały (ale obecny w standardzie XML 1.0 i 1.1).
DTD służy także do definiowania encji. Więcej o DTD na kolejnych zajęciach.
Strukturę logiczną i fizyczną dokumentu zapisuje się w tekście za pomocą znaczników.
Poprawnym dokumentem XML jest np.:
<a/>
Poniższy przykład pokazuje sposób zapisywania poszczególnych konstrukcji:
<?xml version="1.0" encoding="iso-8859-2"?> <!DOCTYPE element_glowny [ <!ENTITY encja "To jest wartość encji prostej"> <!ENTITY encja2 "<element>To jest wartość encji <podelement>złożonej</podelement></element>"> ] > <!-- Tu może być komentarz lub instrukcja przetwarzania, ale nie zwykły tekst ani elementy --> <element_główny> <?instrukcja atrybut="wartość" ale można też tak?> <podelement atrybut='Wartość atrybutu' inny-atrybut="Referencje do encji prostych: &encja; ""> Zawartość tekstowa <elem>i zanurzony element</elem>. <!-- Komentarze i instrukcje dozwolone --> <element_pusty może_mieć="atrybut"/> </podelement> Zawartość tekstowa &encja; Ƕ &encja2; <![CDATA[x < 5 && x > -5]]> </element_główny> <!-- Tu może być komentarz lub instrukcja, ale nie zwykły tekst ani elementy -->
Popraw błędy w dokumencie dok1.xml. Aby sprawdzić poprawność pod Windows, otwórz w IE albo Firefoxie; pod Linuxem użyj Firefoxa albo programu xmllint (więcej na końcu strony).
Zapisz (na kilka sposobów) w treści dokumentu sekwencję znaków ]]>
.
Zapisz jako wartość atrybutu wyrażenie "x > -5" & 'x < 5'
.
Dowolność w nadawaniu nazw elementom jest wygodna, ale może również doprowadzić do niejednoznaczności.
Na przykład element kod
może oznaczać:
Dopóki kod źródłowy i kod pocztowy występują zawsze w różnych dokumentach, nie stanowi to problemu, ale jeśli Antek i Ola zechcą połączyć swoje dokumenty (np. dodać metadane o autorze do artykułu), pojawi się problem z interpretacją znaczenia tych elementów.
Z powyższych przyczyn został opracowany standard Namespaces in XML, który pozwala na unikalne (w skali globalnej) nazywanie elementów, zachowując jednocześnie wygodę używania względnie krótkich nazw.
Przestrzeń nazw to zbiór nazw elementów i atrybutów (ale w skrócie mówi się element należy do przestrzeni nazw). Przestrzeń nazw jest identyfikowana przez identyfikator przestrzeni nazw (namespace name), którym może być dowolny URI.
W dokumencie zadeklarowane są prefiksy przestrzeni nazw.
Deklaracje występują w elementach, jako specjalne atrybuty o nazwach zaczynających się od xmlns
.
Prefiksy obowiązują w elemencie, w którym są zadeklarowane, i w poddrzewie. W podelementach mogą zostać nadpisane.
W danym miejscu dokumentu każdemu prefiksowi odpowiada jedna przestrzeń nazw, jednej przestrzeni nazw może odpowiadać wiele prefiksów. Ponadto jedna przestrzeń nazw może być tzw. domyślną przestrzenią nazw, należą do niej elementy bez prefiksu.
Nazwa w dokumencie (elementu, atrybutu, ale nie tylko) może posiadać prefiks lub nie. Jeśli posiada, należy do przestrzeni nazw wskazywanej przez ten prefiks. Jeśli nie, nazwa elementu należy do domyślnej (w danym miejscu) przestrzeni nazw.
W dokumencie mogą występować nazwy nie należące do żadnej przestrzeni nazw. Są to wszystkie nazwy atrybutów bez prefiksu
oraz nazwy elementów bez prefiksu jeśli w danym miejscu nie obowiązuje domyślna przestrzeń nazw.
Brak przestrzeni nazw oznacza się pustym identyfikatorem p.n. (w tym sensie, że np. w Javie jest równy null
a nie ""
).
Domyślna przestrzeń nazw nie obowiązuje dla atrybutów. Jeśli atrybut nie ma prefiksu, to nie należy do żadnej przestrzeni nazw. Natomiast interpretacja znaczenia tego atrybutu zależy od elementu, w jakim się znajduje (czasami mówi się też o przestrzeni nazw elementu, ale nie jest to formalne). Stąd "normalnie" atrybuty zapisuje się bez prefiksów, natomiast atrybuty z prefiksami stosuje się, gdy do elementów z jednego typu dokumentu chcemy dopisać metainformację związaną z jakimś innym typem dokumentu (innym standardem) – przykładem takiego użycia atrybutów "z zewnątrz" jest standard XLink.
Poniższy przykład przedstawia sposób zapisywania przestrzeni nazw w dokumentach.
<?xml version="1.0"?> <artykul xmlns="http://antek.com/ARTYKUL" xmlns:inf="http://antek.com/INFORMATYCZNE"> <autor email="antek@antek.com"> <ad:osoba xmlns:ad="http://ola.net/namespaces/adresy"> <ad:imie>Antek</ad:imie><ad:nazwisko>Mądry</ad:nazwisko><ad:kod>00-111</ad:kod><ad:miasto>Warszawa</ad:miasto> </ad:osoba> </autor> <tresc xmlns:ref="http://antek.com/REFERENCJE"> <rozdzial ref:klucz="r01"> Fabrykę parserów SAX pobiera się metodą: <inf:kod>SAXParserFactory.newInstance()</inf:kod>. Dokładnie jest to opisane w rozdziale <ref:odnosnik do="r02"/>. </rozdzial> </tresc> </artykul>
W związku z przestrzeniami nazw pojawia się wiele terminów związanych z nazwami w dokumentach XML.
Załóżmy, że w danym miejscu dokumentu prefix pre
związany jest z przestrzenią nazw http://foo.com/NS1
,
a domyślną przestrzenią nazw jest http://foo.com/NS
.
Wówczas poszczególne terminy znaczą (- oznacza brak wartości):
termin | wartość dla elementu aaa | wartość dla elementu pre:bbb |
wartość dla atrybutu ccc w elemencie pre:bbb |
---|---|---|---|
qualified name | aaa |
pre:bbb |
ccc |
local name | aaa |
bbb |
ccc |
namespace prefix | - | pre |
- |
namespace name | http://foo.com/NS |
http://foo.com/NS1 |
- |
expanded name | (http://foo.com/NS , aaa ) |
(http://foo.com/NS1 , bbb ) |
(- , ccc ) |
Zidentyfikuj i popraw błędy w dokumencie dok2.xml. Czy atrybuty w coś2
są poprawne?
Aby sprawdzić poprawność otwórz w IE (albo wybierz zakładkę Browser w XML Spy).
http://nazwy.org/wizytownik
,
a którego podelementami będą wizytówki, takie jak utworzona przed chwilą (w starej przestrzeni nazw).W 2004 roku status rekomendacji uzyskała nowa wersja standardu XML: XML 1.1 wraz z nową wersją Namespaces in XML 1.1.
Najważniejsze różnice w stosunku do wersji 1.0:
…
i 

,#x01
do #x1F
(co jest nielegalne w XML 1.0, poza znakami tabulacji i nowego wiersza),