Plan zajęć
- Omówienie zagadnienia parsowania dokumentów
- Walidacja dokumentów XML - DTD i XML Schema
- Przetwarzanie dokumentów XML w języku perl
- Przetwarzanie dokumentów XML przy pomocy CSS
- Wyszukiwanie w dokumentach XML - język XPath
Standard języka XML w wersji 1.0 został zarekomendowany w roku 1998. Organem, który jest odpowiedzialny za standaryzację języka XML jest WWW Consortium (W3C).
Podstawowe założenia języka XML - prosty w implementacji, możliwość tworzenia nowych języków znaczników, kontekstowość, czyli przechowywanie danych wraz z ich znaczeniem, oraz brak bezpośredniej możliwości prezentacji zawartości dokumentów.
Podstawowe składniki dokumentu XML to: elementy, atrybuty, deklaracje,
instrukcje przetwarzania i encje. Poniżej przedstawiono przykładowy plik za pisany zgodnie z standardem XML (osoby.xml).
<?xml version="1.0" encoding="UTF-8" ?>
<dane>
<osoba>
<imie>Adam</imie>
<nazwisko>Kowalski</nazwisko>
</osoba>
<osoba>
<imie>Marek</imie>
<nazwisko>Abacki</nazwisko>
</osoba>
<osoba>
<imie>Andrzej</imie>
<nazwisko>Babacki</nazwisko>
</osoba>
</dane>
Poprawnie sformatowanym dokumentem XML nazywamy dokument, który spełnia wymagania składniowe stawiane przez specyfikację XML 1.0 utworzoną przez W3C. Poprawność sformułowania oznacza, że istnieje co najmniej jeden element w dokumencie oraz istnieje element główny. Pozostałe elementy występujące w dokumencie zawarte są w elemencie głównym oraz każdy otwarty tag posiada swój tag zamykający. Każdy dokument XML musi być poprawny. Każdy błąd w dokumencie powoduje przerwanie jego dalszego przetwarzania - parsowania.
Reguły tworzenia dokumentu XML
| 1. | Deklaracja XML | <?xml version=... ?> |
| 2. | Deklaracja tekstowa | <?xml encoding=... ?> |
| 3. | Deklaracja typu dokumentu | <!DOCTYPE ... > |
| 4. | Znacznik początkowy | <name atr1="wart1" atr2="wart2" > |
| 5. | Znacznik końcowy | </nazwa> |
| 6. | Znacznik pusty | <name atr1="wart1" atr2="wart2" /> |
| 7. | Odwołanie do encji | &encja; |
| 8. | Odwołanie znakowe | đ |
| 9. | Komentarz | <!-- to jest komentarz --> |
| 10. | Sekcja CDATA | <![CDATA[ tekst nieparsowany ]]> |
| 11. | Instrukcja przetwarzająca | <?aplikacja dane ?> |
| 12. | Białe znaki |
Na serwerze Pascal zostały zainstalowane narzędzia wspierające tworzenie dokumentów XML i ich przetwarzanie.
Parsowanie dokumentu XML (rys.1) jest realizowane przez każdy program, który przetwarza dokumenty XML. Jest pierwszy etap przetwarzania dokumentu. Jeżeli w czasie parsowania dokumentu zostanie znaleziony błąd, dalsze przetwarzanie dokumentu zostanie przerwane. Każda przeglądarka umożliwia wyświetlenie dokumentu XML - posiada wbudowany parser dokumentów XML. Dodatkowo na serwerze pascal zostały udostępnione aplikacje (narzędzia) testujące poprawnoć składni XML - xmllint oraz programy należące do pakietu xerces w projekcie Apache.
Sprawdzanie poprawności dokumentu XML z wykorzystaniem programu xmllint.
> xmllint osoby.xml
Kolejnym etapem przetwarzania dokumentu jest sprawdzanie czy elementy występujące w dokumencie spełniają założenia autora dokumentu. Opis wzajemnej zależności zastosowanych elementów, czy argumentów opisuje struktura dokumentu zapisana w definicji typu dokumentu DTD, czy też w schematach XML. Metoda DTD jest starszą i wywodzi się z SGML.
Operacja sprawdzająca zgodność dokumentu XML z opisującym go dokumentem DTD czy XML Schema nazywana jest walidacją. Walidacja dokumentu występuje na co najmniej czterech poziomach. Po pierwsze - sprawdzana jest struktura dokumentu - użycie i umiejscowienie elementów i atrybutów. Następnie przeprowadzana jest kontrola typu danych - wzorce danych znakowych. W kolejnym etapie sprawdzana
jest spójność danych - stan łączy pomiędzy wierzchołkami i zasobami, oraz na koniec kontrola reguł biznesowych.
Poniżej przykład definicji DTD dla przedstawionego powyższej dokumentu XML.
<!ELEMENT dane ( osoba* ) > <!ELEMENT osoba ( imie, nazwisko ) > <!ELEMENT imie (#PCDATA) > <!ELEMENT nazwisko (#PCDATA) >
Deklaracje DTD można zawrzeć zarówno w dokumencie XML jak i w dokumencie zewnętrznym. Poniżej przedstawiono obydwie konstrukcje programistyczne.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE dane [
<!ELEMENT dane ( osoba* ) >
<!ELEMENT osoba ( imie, nazwisko ) >
<!ELEMENT imie (#PCDATA) >
<!ELEMENT nazwisko (#PCDATA) >
] >
<dane>
<osoba>
<imie>Adam</imie>
<nazwisko>Kowalski</nazwisko>
</osoba>
<osoba>
<imie>Marek</imie>
<nazwisko>Abacki</nazwisko>
</osoba>
<osoba>
<imie>Andrzej</imie>
<nazwisko>Babacki</nazwisko>
</osoba>
</dane>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE dane SYSTEM "osoby.dtd" >
<dane>
<osoba>
<imie>Adam</imie>
<nazwisko>Kowalski</nazwisko>
</osoba>
<osoba>
<imie>Marek</imie>
<nazwisko>Abacki</nazwisko>
</osoba>
<osoba>
<imie>Andrzej</imie>
<nazwisko>Babacki</nazwisko>
</osoba>
</dane>
Dokument osoba.dtd zawiera zawiera tylko przedstawione powyżej definicje DTD.
> xmllint --valid osoby.xml
> xmllint --valid osoby.xml
> xmllint --dtdvalid osoby.dtd osoby.xml
Język XML Schema został opracowany przez W3C i służy do definiowania struktury dokumentu XML. XML Schema jest w przeciwieństwie do DTD opracowany zgodnie z strukturą dokumentu XML. Poniżej przedstawiony został dokument osoby.xsd zawierający opis definicji opisujący plik osoby.xml.
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!-- deklaracja znacznikow -->
<xsd:element name="dane" type="dane-typ"/>
<xsd:element name="nazwisko" type="xsd:string"/>
<xsd:element name="imie" type="xsd:string"/>
<!-- definicje typiow zlozonych -->
<xsd:complexType name="dane-typ">
<xsd:sequence>
<xsd:element name="osoba" type="osoba-typ" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="osoba-typ">
<xsd:sequence>
<xsd:element ref="imie" maxOccurs="unbounded"/>
<xsd:element ref="nazwisko"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
> xmllint --schema osoby.xsd osoby.xml
Encja ma swoją nazwę i wartość - fragment dokumentu. Aby można użyć danej encji należy ją zadeklarować w DTD (nie dotyczy to pięciu encji predefiniowanych). Procesor XML w trakcie przetwarzania dokumentu podsatwia w miejsce referencji do encji odpowiednie wartości.
Referencja do encji ogólnej w dokumencie ma postać &nazwa_encji; i występuje poza DTD, natomiast deklaracja w DTD.
<!ENTITY nazwa-encji wartość-encji >
Można deklarować wiele deklaracji encji o tej samej nazwie, jednak wykorzystana zostanie pierwsza. Wartość encji może być podana bezpośrednio w deklaracji ujęta w znaki " lub ', wtedy encję nazywamy wewnętrzną. Można też zadeklarować encję zewnętrzną - jest to uogólnienie pliku, czyli dodatkowy zasób dostępny dla procesora XML. Do identyfikacji encji zewnętrznej służy identyfikator systemowy lub identyfikator publiczny. Domyślnie encja po wstawieniu jest przetwarzana jako XML, powinna być fragmentem XML dającym się sparsować (jeśli jest znacznik otwierający, powinien być zamykający itp.), ponadto może zaczynać się od deklaracji analogicznej do deklaracji XML, podającej wersję XML i kodowanie.
<!ENTITY wewnetrzna "zawartość encji">
<!ENTITY zewnetrzna_id_systemowy SYSTEM "http://www.serwis.com/opis.xml">
Przykład dokumentów XML z encjami (lista.xml, grupa1.xml i grupa2.xml).
<?xml version="1.0" standalone="no" ?> <!DOCTYPE lista [ <!ENTITY title "Lista osob" > <!ENTITY grupa1 SYSTEM "grupa1.xml"> <!ENTITY grupa2 SYSTEM "grupa2.xml"> ]> <lista> <title>&title;</title> &grupa1; &grupa2; </lista>
<grupa>
<osoba>
<imie>Adam</imie>
<nazwisko>Kowal</nazwisko>
</osoba>
<osoba>
<imie>Marek</imie>
<nazwisko>Abacki</nazwisko>
</osoba>
</grupa>
<grupa>
<osoba>
<imie>Adam</imie>
<nazwisko>Cabacki</nazwisko>
</osoba>
<osoba>
<imie>Marek</imie>
<nazwisko>Dadacki</nazwisko>
</osoba>
</grupa>
Sprawdzanie poprawności dokumentu XML z wykorzystaniem programu xmllint.
> xmllint --noent lista.xml
#!/usr/bin/perl
use strict;
use XML::LibXML;
# Utworzenie instancji parser'a
my $parser = XML::LibXML->new();
my $source;
my $xmlfile="osoby.xml";
# Wlaczenie opcji walidacji dokumentu XML przy pomocy DTD w parserze.
# Opcjonalnie walidacja jest wylaczona.
$parser->validation(1);
eval {
$source = $parser->parse_file($xmlfile) ;
} ;
if ($@) {
print "$xmlfile - Blad w czasie walidacji dokumentu ! \n";
die "$@" ;
}
print "$xmlfile - Walidacja przeszla poprawnie.\n" ;
Uwaga. należy umieścić w pliku XML informację o DOCTYPE dokumentu XML.
Prezentacja zawartości dokumentów XML'owych w przeglądarkach jest możliwa przy wykorzystaniu technologii CSS i XSL.
W pierwszej przypadku wystarczy wykorzystać kaskadowe arkusze styli (Cascading Style Sheets, CSS) do przetworzenia
zawartości dokumentu XML, natomiast w drugim przypadku należy posłużyć się rozbudowaną technologią XSLT/XSL
(eXtensible Stylesheet Language - Transformations).
W pierwszej metodzie dokument XML jest sekwencyjnie przetwarzany przez przeglądarkę w oparciu o dołączony dokument CSS.
Specyfikacja CSS stanowi język formatowania do elementów dokumentu pozwalający autorom i użytkownikom dołączać
odpowiednie style do tych struktur.
Przykład pliku CSS formatującego opisywany dokument XML (osoby.css).
osoba { display: block; text-align:left }
imie { font-style:italic }
nazwisko { font-weight:bold }
W celu wykorzystanie pliku CSS należy umieścić w dokumencie XML po linii deklaracji (jeżeli występują deklaracje typu, to też po nich) następujące polecenie.
<?xml-stylesheet type="text/css" href="osoby.css" ?>
Język XPath (XML Path Language) [6,7,8,9,10] jest językiem kwerend, używanym do wyszukiwania i pobierania informacji z węzłów dokumentu XML.
Prezentację języka XPath wykonamy wykorzystując dokument XML zawarty w pliku dok1.xml.
Do wyszukiwania określonych informacji w węzłach dokumentu XML wykorzystamy programy xmllink [11] (program pracujący z linii poleceń) i
xmlcopyeditor [12] (program pracujący w trybie graficznym) zainstalowane na serwerze "pascal" oraz polecenie xpath.
Poniżej uruchomienie programu w xmllink w trybie interaktywnym.
xmllint --shell dok1.xml
Przykładowe polecenia xpath w xmllint.