XML – ćwiczenia 1: Wprowadzenie

XML - Extensible Markup Language

Czym jest XML?

  • XML to standard, opisany w rekomendacji W3C, następca standardu 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.
  • Ale XML to przede wszystkim metajęzyk, czyli klasa języków zwanych zastosowaniami XML. Są nimi np. XHTML, XML Schema, WSDL, XSLT, SVG, RDF, MathML i wiele innych. Także my na ćwiczeniach będziemy definiowali własne zastosowania XML. Wszystkie te języki mieszczą się we wspólnych ramach jeśli chodzi o składnię, dzięki czemu można do nich wszystkich używać tych samych technologii takich jak parsery czy wysokopoziomowe języki dostępu do danych (XSLT, XQuery).
  • XML jest oparty o model dokumentu jako drzewa, którego węzłami są elementy a liśćmi – pola tekstowe (plus jeszcze parę innych rodzajów węzłów).

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-FO), 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.

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 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 odczytywać i przetwarzać na wysokim poziomie abstrakcji, traktując dokument jako drzewo danych, a pomijając warstwę leksykalną. Służą temu standardy takie jak XPath, XSLT, XQuery oraz choćby technologia JAXB w Javie.

Dane źródłowe w XML nadają się przekształcania do innych formatów (XML, HTML, inne formaty tekstowe), służy temu m.in. standard XSLT.

Technikalia

Do edycji dokumentów XML, w tym także XML Schema czy XSLT, teoretycznie moż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.xml

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

xmllint -valid -noout plik.xml

waliduje dokument.

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. Zacznijmy od najwyższego poziomu abstrakcji.

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 (ang. text node) jest zawsze liściem drzewa. W dokumencie istnieje dokładnie jeden element główny.

Element (ang. 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 (ang. attribute) jest identyfikowany przez nazwę, jego wartością jest tekst. Jeden element nie może posiadać dwóch atrybutów o tej samej nazwie.

Uwaga na terminologię: węzły tekstowe i atrybuty mają wartość (ang. value), elementy zawartość (ang. content)

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 (ang. processing instruction) zawiera dodatkowe informacje skierowane do programów odczytujących dany dokument. Instrukcja składa się z podmiotu (ang. 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 sieci czy 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 (jako wewnętrzne lub zewnętrzne). 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 252, 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.

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, 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 wciąż 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_główny>
  <?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 może_mieć="atrybut"/>
  </podelement>
  Zawartość tekstowa &encja; &#502;
  &encja2;
  <![CDATA[x < 5 && x > -5]]>
</element_główny>
<!-- Tu może być komentarz lub instrukcja, ale nie zwykły tekst ani elementy -->

Zadanie 1.

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.


Correct syntax errors in this document dok1.xml. Use a Web browser to check the file.

Zadanie 2.

  1. W zwykłym edytorze tekstu (np. Notatnik pod Windows) stwórz dokument XML – własną wizytówkę. Strukturę dokumentu i nazwy elementów/atrybutów ustal samodzielnie. Staraj się skoncentrować na strukturze logicznej, a nie wyglądzie.
  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" i doprowadź dokument do poprawności.

  1. Using a plain text editor (e.g. Notepad), create an XML document – your visit card. Establish the document structure by yourself. Try to focus on the logical structure, not the visual one.
  2. Check the syntax correctness using a Web browser.
  3. Use some non-ASCII characters and declare the valid encoding.

Zadanie 3.

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


Write down (in several ways) the character sequence ]]> in a document body.

Zadanie 4.

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


Write as an attribute value the expression "x > -5" & 'x < 5'.

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

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.

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.

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

Zidentyfikuj i popraw błędy w dokumencie dok2.xml. Czy atrybuty w coś2 są poprawne? Aby sprawdzić poprawność, otwórz w przeglądarce.


Open document dok2.xml in a browser. Correct namespace-related errors.

Zadanie 6.

  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://nazwy.org/wizytownik, a którego podelementami będą wizytówki, takie jak utworzona przed chwilą (w ich przestrzeni nazw).

  1. Place all elements from your visit-card in a new namespace.
  2. Create a document called rolodex (a set of visit cards), the root element of which is to be in a separate namespace. The rolodex should contain one or more visit-cards in their namespace (summarising: two namespaces are to be used in a single document).

XML 1.1

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:


Valid XHTML 1.1Valid CSS