R-23-07.doc

(275 KB) Pobierz
PLP_Rozdział_23

Rozdział 23. XML i libxml

Ostatnio najmodniejszym tematem jest XML, czyli eXtensible Markup Language. Jeżeli spojrzymy do którejkolwiek gazety „komputerowej”, to znajdziemy wzmiankę o XML, często w połączeniu ze skrótami SAX, XSLT, DOM, DTD i innymi. Przeglądając katalogi książek, również można natrafić na bardzo wiele pozycji poświęconych XML i tematom pokrewnym.

Podczas wstępnych rozmów z wydawnictwem Wrox omawialiśmy koncepcję i zawartość tej książki oraz przykładową aplikację, która miała posłużyć jako szkielet pomagający pokazać metody omawiane w każdym z rozdziałów. Aby ta aplikacja działała, potrzebne były jakieś przykładowe dane do katalogu wypożyczalni płyt DVD. Wydawnictwo natychmiast wysłało nam dane (podziękowania dla DanM!) w formacie XML. Oto początkowy fragment tego pliku pokazany dla oddania atmosfery (przy okazji: ceny nie są poprawne):

 

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>

<!DOCTYPE catalog [

 

<!ELEMENT catalog (dvd+) >

<!ELEMENT dvd (title, price, director, actors, year_made)>

<!ATTLIST dvd

          asin CDATA #REQUIRED >

<!ELEMENT title (#PCDATA)>

<!ELEMENT price (#PCDATA)>

<!ELEMENT director (#PCDATA)>

<!ELEMENT actors (actor+)>

<!ELEMENT actor (#PCDATA)>

<!ELEMENT year_made (#PCDATA)>

 

]>

 

<catalog>

   <dvd asin="0780020707">

      <title>Grand Illusion</title>

      <price>29.99</price>

      <director>Jean Renoir</director>

      <actors>

         <actor>Jean Gabin</actor>

      </actors>

      <year_made>1938</year_made>

   </dvd>

 

   <dvd asin="0780020685">

      <title>Seven Samurai</title>

      <price>27.99</price>

      <director>Akira Kurosawa</director>

      <actors>

         <actor>Takashi Shimura</actor>

         <actor>Toshiro Mifune</actor>

      </actors>

      <year_made>1954</year_made>

   </dvd>

 

...

</catalog>

Były to rzeczywiście dobre dane przykładowe i nie byliśmy raczej zdumieni formatem przekazu, ale w jaki sposób mieliśmy je przekształcić na postać użyteczną w naszej bazie danych? Początkowo zakładaliśmy, że dane będą dostarczone w postaci pliku z polami oddzielonymi za pomocą przecinków (tzw. format CSV, ang. comma separated variable) lub w innym formacie łatwo przyswajalnym przez bazę danych.

Oczywiście, można było napisać nowy program w języku C (lub w języku Python, Perl... itd.), który zmieniałby format zapisu danych. Myśleliśmy także o zastosowaniu programów flex i bison wspomagających obsługę składni. Zastanawialiśmy się nad napisaniem programu przekształcającego w postaci arkusza stylu (XSL, eXtensible Stylesheet Language), próbując rozgryźć ten plik za pomocą programu awk lub wyrażeń regularnych języka Perl...

Doszliśmy w końcu do wniosku, że... dokonanie „poprawnego” rozbioru XML będzie możliwe za pomocą parsera XML. Po cóż budować własny parser, jeśli istnieje kilka eleganckich i bezpłatnych programów? Ich zastosowaniem zajmiemy się w tym rozdziale.

Opiszemy tutaj następujące zagadnienia:

q       Krótki przegląd dokumentów XML i sposoby ich definiowania,

q       Przegląd zastosowań niektórych programów wspomagających przetwarzanie dokumentów XML w systemie Linux,

q       Omówienie wywołań zwrotnych programu SAX zastosowanych do pobierania danych z dokumentu XML.

Struktura dokumentu XML

Zanim zajmiemy się problemami odzysku danych z naszego dokumentu dvdcatalog.xml, powinniśmy dokładnie poznać, czym jest XML i jak są tworzone dokumenty XML.

Składnia XML

Na pierwszy rzut oka dokumenty XML wyglądają bardzo podobnie do dokumentów HTML, ponieważ zawierają znaczniki, atrybuty znaczników oraz dane między znacznikami. Takie podobieństwo wynika z tego, że zarówno HTML, jak i XML wywodzą się ze wspólnego źródła, czyli z SGML (Standard Generalized Markup Language). XML jest podzbiorem SGML i — mimo podobieństwa do HTML występują między nimi bardzo ważne różnice:

q       HTML jest używany głównie dla celów zobrazowania informacji.

Niezależnie od tego, że pierwotne wersje HTML koncentrowały się wokół opisu elementów dokumentu (np. „to jest nagłówek”), to później zaczęto stosować wiele znaczników (ang. markup tags) niosących informację o sposobie wyświetlania danych, nie rozszerzając jednak ich znaczenia na definicje faktycznej zawartości dokumentu. Znaczniki w XML nie zawierają zaś informacji o sposobie prezentacji dokumentu — mówią natomiast o tym, czym są w istocie przekazywane w nim dane. Oczywiście, możemy użyć znaczenia danych do określenia sposobu ich prezentacji, ale mimo wszystko jest to bardzo istotne rozróżnienie. Spójrzmy na pierwszy film opisany w naszym przykładowym dokumencie. Na stronie HTML opisującej ten film moglibyśmy widzieć wyróżniony tekst „Jean Renoir” i „Jean Gabin”, oznaczający osoby. Bez informacji kontekstowej nie można byłoby jednak powiedzieć, kto jest aktorem, a kto reżyserem. W XML możemy oznaczyć te pola właśnie odpowiednio jako reżysera i jako aktora, czyli przekazać informację o ich znaczeniu.

q       Dokumenty HTML nie są spełniają wymagań XML.

Odnosi się to nawet do tych dokumentów, które są zgodne z definicjami HTML w wersji 4. Została zdefiniowana nowa wersja HTML oznaczana skrótem XHTML, która zapewnia równoczesną zgodność definicji XHTML i XML.

q       W znacznikach XML jest brana pod uwagę wielkość liter.

W HTML znacznik <H1> jest traktowany tak samo jak znacznik <h1>, lecz w XML są to całkowicie różne znaczniki. W języku angielskim nieco dziwna wydaje się zamiana wielkich liter na małe, ale w innych językach uzależnienie XML od wielkości liter jest przyjmowane w sposób naturalny i pozwala uniknąć wielu pułapek spotykanych przy automatycznej konwersji. Dane XML nie ograniczają się tylko do zestawu znaków ASCII; można w nich stosować pełny zestaw UNICODE, jeżeli tylko jest to potrzebne. Nie wolno tylko używać znaczników, których nazwy rozpoczynają się od xml lub xsl, niezależnie od wielkości użytych liter. Wszystkie nazwy, które tak się rozpoczynają, są zarezerwowane przez World Wide Web Consortium (W3C), czyli przez komitet normujący XML.

Dobrze sformatowany dokument XML

Podobnie jak najnowsze wersje standardu HTML, również i standardy dla dokumentów XML są ściśle określone za pomocą reguł składniowych opracowanych przez World Wide Web Consortium (dalej nazywane W3C). Można się z nimi zapoznać w materiałach źródłowych wymienionych na końcu tego rozdziału. Dokument XML musi spełniać te wymagania, aby można było go nazwać dokumentem „dobrze sformatowanym”. Jeżeli te reguły nie są spełnione, nie jest to dokument XML.

W tym rozdziale omówimy skrótowo reguły składni XML, których należy przestrzegać.

Sekcje

Każdy dokument XML składa się z trzech sekcji  (a nie tak jak HTML — z dwóch). Sekcje te zostały nazwane: prolog, treść i epilog (faktycznie w standardzie nie użyto nazwy epilog). Jedynie sekcja treść (ang. body) jest obowiązkowa; pozostałe dwie nie muszą występować w dokumencie.

Prolog

Pierwsza sekcja dokumentu XML stanowiąca prolog „może i powinna rozpoczynać się od deklaracji XML” (to cytat wzięty z oficjalnej normy). Pomimo tego, że przed chwilą wspomnieliśmy o braku przymusu użycia tej sekcji, to dokument normatywny zaleca użycie jej przynajmniej w minimalnej postaci we wszystkich dokumentach XML. Deklaracja XML wygląda następująco:

 

<?xml version="1.0"?>

Jak łatwo odgadnąć, deklaracja ta zawiera nie tylko informację, że dokument jest dokumentem XML, ale także to, że spełnia określoną wersję specyfikacji XML (w tym przypadku 1.0). Można także podać w tej deklaracji specyfikację języka oraz informacje dodatkowe, mówiące czytelnikowi (człowiekowi lub komputerowi), czy do interpretacji XML wymagane są jakieś dokumenty zewnętrzne. W naszym przykładzie wygląda to następująco:

 

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>

Mamy tu informację, że w dokumencie użyto znaków ośmiobitowych zdefiniowanych w zestawie Unicode UTF-8 (czyli ISO-LATIN1) i że nie są wymagane żadne dokumenty zewnętrzne. W prologu można także określić typ dokumentu, rozpoczynając od oznaczenia <!DOCTYPE (tak jak w naszym przykładzie). Ponieważ jednak nie omawialiśmy tego oznaczenia, to powrócimy do niego przy okazji skrótowego omawiania definicji typów dokumentu. Prolog może także zawierać komentarze.

Treść

W treści dokumentu XML znajdują się właściwe dane. Zawiera ona tylko jeden element — objęty parą znaczników w taki sposób, jak dokument HTML jest objęty znacznikami <HTML>...</HTML>. W XML każdy element może zawierać elementy zagnieżdżone dowolnego poziomu. W naszym przykładzie pojedynczym elementem jest catalog, w którym są zagnieżdżone inne elementy zawierające także zagnieżdżone elementy itd. Dość trudną definicję „elementu” odłożymy do następnego podrozdziału.

W treści można wstawiać komentarze.

Epilog

Epilog jest często pomijany. Może on zawierać instrukcje dotyczące przetwarzania i opisy zaawansowanych zagadnień, którymi nie musimy się tutaj zajmować.

Elementy

Definiując treść dokumentu XML, dla wygody pominęliśmy definicję samego elementu. Ponieważ element jest podstawowym kontenerem do przechowywania danych w dokumencie XML, to jego znaczenie jest bardzo ważne. Musimy więc omówić go oddzielnie w tym podrozdziale.

Elementy są pojemnikami zawierającymi dane, atrybuty, inne elementy lub kombinacje tych wszystkich składników. Elementy są ograniczane za pomocą znaczników w nawiasach trójkątnych, podobnych do znaczników HTML. W odróżnieniu od HTML, w XML nie wolno pominąć znacznika końcowego (w HTML często pomijany jest np. znacznik końcowy </P>). Oprócz tego, o czym już wspomniano, w znacznikach ważna jest wielkość liter.

Znacznik początkowy składa się z otwierającego nawiasu trójkątnego, nazwy i opcjonalnego zestawu atrybutów oraz z końcowego nawiasu trójkątnego. Znacznik końcowy zawiera dodatkowo ukośnik umieszczony za nawiasem otwierającym. Poprawnie zapisany znacznik XML ma więc następującą postać:

 

<my_tag_name>The data content goes here</my_tag_name>

W pełni dozwolony jest brak zawartości między parą znaczników. Oznacza to, że zamiast pisać:

 

<my_tag_name> </my_tag_name>

możemy użyć skróconego zapisu:

 

<my_tag_name/>

Taki pusty znacznik może wyglądać nieco dziwnie, ale tylko dlatego, że nie omówiliśmy jeszcze atrybutów znacznika. Pozwalają one zawrzeć w znaczniku informację ilościową prawie w taki sam sposób, jak w znacznikach HTML. Jako przykład można podać specyfikację tabeli, zawierającą szerokości marginesu i wypełnienia:

 

<TABLE BORDER="2" CELLPADDING="10">

...

</TABLE>

W XML dodajemy atrybuty z wartościami w bardzo podobny sposób, na przykład zapis:

 

<my_tag_name text_type="example">The data content goes here</my_tag_name>

definiuje znacznik z atrybutem text_type o wartości example.

Zasady dodawania atrybutów do znaczników XML są bardziej ścisłe niż przy znacznikach HTML:

q       W XML wszystkie wartości atrybutów muszą być ujęte w cudzysłów lub w apostrofy. Nie można więc np. użyć znacznika <TABLE BORDER=2>, który w HTML jest poprawny.

q       W HTML jest możliwe, chociaż czasami powoduje to błędy, kilkakrotne użycie tej samej nazwy atrybutu w ramach jednego znacznika. W XML takie powtórzenia nie są dozwolone.

q       W wartościach atrybutów nie mogą występować dwa znaki specjalne < i &. Zamiast nich trzeba stosować znane także z HTML skróty &lt; i %amp;.

q       Jeżeli wewnątrz atrybutu muszą występować cudzysłowy tego samego rodzaju, co cudzysłowy ograniczające wartość atrybutu, to zamiast nich należy użyć skrótów &apos; (dla oznaczenia apostrofu) lub &quot; (dla oznaczenia pojedynczego znaku cudzysłowu).

Jasne są kryteria wyboru informacji przekazywanej w części znacznika zawierającej atrybuty oraz w postaci danych zawartych między parą znaczników. Ogólnie mówiąc, jeżeli dane nie zmieniają znaczenia, a zwłaszcza nie zmieniają wartości, to należy zastosować atrybuty. Jeżeli informacja nie zależy od jakichś czynników, to należy ją przekazać jako dane. Jako przykład, można podać dokument XML opisujący samochód. Kolor samochodu może występować jako atrybut, ponieważ nie zmienia istoty samego samochodu, stanowiąc tylko szczegół jego wyglądu. Pojemność silnika powinna być jednak przekazywana jako dane, ponieważ istotnie wpływa na sam samochód. Jeśli nie mamy pewności, jak rozdzielić taką informację, to zawsze bezpieczniejsze będzie przekazanie jej jako dane, a nie jako atrybut.

Zagnieżdżanie elementów

Dokument XML nie byłby wiele wart, gdybyśmy użyli w nim tylko jednego znacznika. Znakomita większość użytecznych cech XML wynika z tego, że znaczniki można w nim zagnieżdżać. W naszym przykładzie pokazanym na początku rozdziału mieliśmy znacznik catalog,...

Zgłoś jeśli naruszono regulamin