XML – ćwiczenia 1: Wprowadzenie

XML - Extensible Markup Language

Czym jest XML?

  • XML to standard, opisany w rekomendacji W3C, oparty o standard SGML.
  • XML to sposób zapisywania danych wraz z ich strukturą w dokumentach tekstowych.
  • XML to język, czyli zbiór dopuszczalnych ciągów znaków. Literami są tu znaki Unicode. Rekomendacja zawiera m.in. gramatykę, która, wraz z pewnymi własnościami opisanymi słownie, definiuje język XML.
  • XML to metajęzyk, czyli klasa języków zwanych zastosowaniami XML. Są nimi np. XML Schema, WSDL, XSLT, XHTML, SVG. Także my na ćwiczeniach będziemy definiowali własne zastosowania XML.
  • XML jest oparty o model dokumentu jako drzewa, którego węzłami są elementy a liśćmi - pola tekstowe.

Czym nie jest XML?

  • 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). Ponadto można wymyślić język programowania w składni XML – w pewnym sensie taką rolę pełni XSLT.

Jak można używać XML

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 dokumenty 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.

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.

Dokument XML

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.

Warstwa logiczna – treść zasadnicza

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 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.

Warstwa logiczna – treść pomocnicza

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 – encje

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 innych aplikacji).

W XML występuje 5 predefiniowanych encji, służących zapisywaniu w treści dokumentu znaków specjalnych:

  • &&
  • <&lt;
  • >&gt;
  • "&quot;
  • '&apos;

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.

Warstwa fizyczna – referencje do znaków i sekcje CDATA

Oprócz referencji do encji istnieją referencje do znaków, np. &#252; to odwołanie do znaku ü o kodzie Unicode 520, a &#x80; 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 (dzięki temu w sekcji CDATA można zacytować dokument XML nie zawierający sekcji CDATA).

Deklaracja 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 lub UTF-16, deklarację XML można pominąć.

DTD

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.

Przykłady

Strukturę logiczną i fizyczną dokumentu zapisuje się w tekście za pomocą znaczników.

Przykład 1.

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_glowny>
  <?instrukcja atrybut="wartość" ale można też tak?>
  <podelement atrybut='Wartość atrybutu' inny-atrybut="Referencje do encji prostych: &encja; &quot;">
    Zawartość tekstowa <elem>i zanurzony element</elem>.
    <!-- Komentarze i instrukcje dozwolone -->
    <element_pusty moze_miec="atrybut"/>
  </podelement>
  Zawartość tekstowa &encja; &#502;
  &encja2;
  <![CDATA[x &lt; 5 & x > -5]]>
</element_glowny>
<!-- Tu może być komentarz lub instrukcja, ale nie zwykły tekst ani elementy -->

Zadanie 1.

Popraw błędy w dokumencie lab01_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).

Zadanie 2.

  1. W zwykłym edytorze tekstu (np. Wordpad pod Windows) stwórz dokument XML – własną wizytówkę.
  2. Otwórz dokument w Internet Explorerze lub Firefoxie. Doprowadź go do poprawności składniowej.
  3. Jeśli jeszcze nie ma, dodaj do dokumentu tzw. "polskie znaki".

Zadanie 3.

Zapisz (na kilka sposobów) w treści dokumentu sekwencję znaków ]]>.

Zadanie 4.

Zapisz jako wartość atrybutu wyrażenie "x > -5" & 'x < 5'.

XML Spy

W dalszej części zajęć będziemy korzystali z komercyjnego programu XML Spy. Jest on zainstalowany w laboratorium pod Windows.

Program znacznie ułatwia pracę z XML i, przede wszystkim, ze związanymi z XML standardami (m.in. XML Schema, XSLT, XQuery). Nie jest jednak pozbawiony pewnych wad :) Z zauważonych od razu:

Zadanie 5.

Włącz program XML Spy. Otwórz w nim własną wizytówkę.

Wykonaj polecenie check well-formedness na poprawnym i niepoprawnym dokumencie.

Przestrzenie nazw

Motywacja

Dowolność w nadawaniu nazw elementom jest wygodna, ale może również doprowadzić do niejednoznaczności. Na przykład element kod może oznaczać:

  • fragment kodu źródłowego w artykułach informatycznych (typ dokumentu opracowany przez Antka),
  • kod pocztowy w książce adresowej (typ dokumentu opracowany przez Olę).

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 krótkich nazw.

Używanie przestrzeni 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. Identyfikator może także być pusty (to znaczy nie ma wartości, a nie jest ciągiem pustym, np. w Javie jest równy null).

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 jest tzw. domyślną przestrzenią nazw, należą do niej elementy bez prefiksu. Inicjalnie jest to przestrzeń nazw o pustym identyfikatorze.

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.

Domyślna przestrzeń nazw nie obowiązuje dla atrybutów. Jeśli atrybut nie ma prefiksu, jego identyfikator przestrzeni nazw jest pusty. 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.

Przykład 2.

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>

Nazewnictwo nazw :)

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 aaawartość 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)

Zadanie 6.

Popraw błędy w dokumencie lab01_dok2.xml. Aby sprawdzić poprawność otwórz w IE (albo wybierz zakładkę Browser w XML Spy).

Zadanie 7.

  1. Umieść wszystkie elementy swojej wizytówki we własnej prywatnej przestrzeni nazw.
  2. Stwórz dokument wizytownik, którego element główny będzie w przestrzeni nazw http://wizytownik, a którego podelementami będą wizytówki, takie jak utworzona przed chwilą (w starej przestrzeni nazw).

XML 1.1

Stosunkowo niedawno (2004-02-04) 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:

Technika

Poza XML Spy można korzystać też z prostszych narzędzi.

Przeglądarki internetowe parsują podany dokument XML i zazwyczaj wyświetlają go jako drzewo.

Pod Linuksem działa program xmllint, parsujący dokumenty XML. Następujące wywołanie:

xmllint -noout plik.xml

sprawdzi poprawność pliku nie wypisując go na ekran.

xmllint -valid -noout plik.xml

waliduje dokument.


Valid XHTML 1.1Valid CSS