r08-01.doc

(404 KB) Pobierz
Helion









Rozdział 1 ¨ Pierwsze kroki (Nagłówek strony)

Rozdział 8

w oryginale 11

.
Java i DOM XML

Cały ten rozdział poświęcimy użyciu Javy do stworzenia samodzielnych programów obsługujących XML. Tak naprawdę utworzymy tutaj kilka przeglądarek. Programy pisać będziemy w oparciu o DOM XML, skorzystamy z pakietów XML for Java (XML4J) IBMowskich alphaWorks (www.alphaworks.ibm.com/tech/xml4j). Ten znany parser zgodny jest ze standardami W3C, zaimplementowano w nim DOM Level 1 i częściowo Level 2. Jest to najczęściej stosowany samodzielny parser współpracujący z Javą. W chwili pisania książki dostępna jest wersja 3.0.1, oparta jest ona parserze XML Apache Xerces w wersji 1.0.3[1].

alphaWorks z dumą informuje, że

XML Parser for Java jest parserem XML napisanym całkowicie w Javie. Pakiet (com.ibm.xml.parser) zawiera klasy i metody pozwalające parsować, generować, przetwarzać i walidować dokumenty XML. XML Parser for Java uważa się za najsolidniejszy dostępny procesor XML, jest on w pełni zgodny z rekomendacją XML 1.0.

Powyższa notatka wskazuje na ważny problem związany z dostępnymi obecnie parserami XML – ich stan właściwie zawsze jest nie do końca określony. Okazuje się, że wspomniany powyżej pakiet parsera com.ibm.xml.parser jest już przestarzały i choć obecnie jeszcze jest obsługiwany, to w przyszłości ma zostać usunięty. Zamiast niego użyjemy zatem pakietu org.apache.xerces.parsers, który jest jego następcą.

Jest to naturalne ryzyko związane z używaniem parserów firm zewnętrznych – narzędzia te swojego czasu były pisane w sposób bardzo swobodny. Kiedy XML był jeszcze bardzo młodym standardem, napisałem książkę opartą na parserze Microsoft XML Java – jedynym dostępnym wtedy parserze XML z dostępem z Javy. Zanim książka ta pojawiła się na półkach księgarń, Microsoft całkowicie zmienił swój parser, wobec czego niemalże żaden fragment kodu z mojej książki nie działał (zresztą opisywany tam pakiet nie jest już nawet dostępny jako samodzielny pakiet). Takie sytuacje wcale nie są rzadkie.

Z drugiej jednak strony warto pamiętać, że parser alphaWorks zmieniono tak, że obecnie działa w oparciu o DOM W3C (do obsługi węzłów i elementów używać będziemy pakietu org.w3c.dom alphaWorks), co oznacza, że w końcu pojawił się pewien standard. Jednak nazwy pakietów i używanych parserów, jak org.apache.xerces.parsers.DOMParser, mogą się nadal zmieniać. W chwili, kiedy książka ta dotrze do Twoich rąk, pakiety mogą zostać zmienione – jeśli tak się stanie, zajrzyj do dokumentacji XML for Java, aby sprawdzić, jakie zmiany musisz wprowadzić w swoim kodzie. Teraz, kiedy dostępny jest model DOM W3C, zmiany te powinny być zminimalizowane względem tego, co działo się dawniej.

W tym i następnym rozdziale uzyskasz niezłe podstawy używania parsera XML for Java, jednak temat jako taki wystarczyłby do wypełnienia całej książki, zresztą książki takie już zaczynają się pojawiać, ale – niespodzianka! – z powodu zmian w parserze są już nieaktualne. Pakiety XML for Java są naprawdę duże, dołączone są do nich setki stron dokumentacji, jeśli chcesz więc nauczyć się programowania XML for Java w zakresie większym niż opisano w tej książce, zajrzyj do dokumentacji.

Parser XML for Java widziałeś już w pierwszym rozdziale tej książki, gdzie przykład DOMWriter umożliwiał walidację dokumentów XML względem DTD. W pierwszym rozdziale używaliśmy dokumentu greeting.xml:

<?xml version="1.0" encoding="iso-8859-2"?>

<DOKUMENT>

  <POZDROWIENIA>

    Witaj w XML

  </POZDROWIENIA>

  <KOMUNIKAT>

    Witaj w pokręconym świecie XML.

  </KOMUNIKAT>

</DOKUMENT>

Dokument ten walidowaliśmy i uzyskaliśmy następującą informację o błędach:

%java dom.DOMWriter greeting.xml

greeting.xml:

[Error] greeting.xml:2:11: Element type "DOKUMENT" must be declared

[Error] greeting.xml:3:15: Element type "POZDROWIENIA" must be declared

[Error] greeting.xml:6:14: Element type "KOMUNIKAT" must be declared

<?xml version="1.0" encoding="iso-8859-2"?>

<DOKUMENT>

  <POZDROWIENIA>

    Witaj w XML

  </POZDROWIENIA>

  <KOMUNIKAT>

    Witaj w pokręconym świecie XML.

  </KOMUNIKAT>

</DOKUMENT>

W tym rozdziale będziemy sami tworzyć programy Java używając XML for Java bezpośrednio. Będziemy parsować i przeszukiwać dokumenty XML oraz tworzyć samodzielne przeglądarki, a nawet samodzielną specjalizowaną przeglądarkę graficzną, która na podstawie dokumentów XML będzie wyświetlała opisane w tych dokumentach kółka. Taka jest właśnie zaleta umiejętności tworzenia samodzielnych programów Javy używających parserów: można tworzyć własne specjalizowane przeglądarki.

Skąd uzyskać XML for Java

Pierwszym krokiem jest „ściągnięcie” XML for Java z Sieci, spod adresu www.alphaworks.ibm.com/tech/xml4j. Wystarczy odnaleźć przycisk Download na stronie, następnie wybrać plik i kliknąć przycisk Download Now. Jeśli na przykład używasz systemu UNIX, możesz wybrać plik XML4J-bin.3.0.1.tar.gz. Jeśli używasz Windows, możesz użyć pliku XML4J-bin.3.0.1.zip. Możesz też pobrać pliki z kodem źródłowym, co umożliwia Ci samodzielne skompilowanie całości.

Po załadowaniu pliku rozpakuj go (w przypadku systemu Windows upewnij się, że Twoje narzędzie rozpakowujące obsługuje długie nazwy!) – i to już wszystko, pakiet XML for Java jest już zainstalowany, trzeba jeszcze tylko zapewnić, że będzie on widoczny dla Javy.

Ustawianie zmiennej CLASSPATH

Z naszego punktu widzenia XML for Java to ogromny zestaw klas gotowych już do użycia. Klasy te znajdują się w plikach JAR (Archiwa Javy), musimy Javie zapewnić dostęp do klas z tych plików.

W poprzednim rozdziale powiedzieliśmy już nieco o tym, jak się to robi. Mówiliśmy o zmiennej CLASSPATH umożliwiającej wskazanie, gdzie ma wyszukiwać dodatkowych klas. Potrzebne nam pliki JAR to xerces.jar oraz xercesSamples.jar (nazwy te mogą się jednak do czasu wydania książki zmienić).

Niestety, sposób ustawiania zmiennej CLASSPATH jest różny w różnych systemach. Aby na przykład ustawić na stałe tę zmienną w Windows NT, używa się Panelu Sterowania. W okienku dialogowym Ustawienia systemowe kliknij zakładkę Środowisko, następnie kliknij zmienną CLASSPATH i wpisz nową wartość

Proszę, aby ktoś posiadający Windows NT przejrzał spolszczone nazwy w tym akapicie (styl „Wyróżnienie”.

. W Windows 95 lub 98 oraz w NT możesz użyć polecenia DOS SET w pliku autoexec.bat. Pamiętaj, że możesz też użyć polecenia SET w oknie MSDOS – wtedy zmienna CLASSPATH będzie ustawiona póki nie zostanie zamknięte to okno, tak zresztą jest zapewne najłatwiej. Jeśli na przykład pliki xerces.jar oraz xercesSamples.jar znajdują się w katalogu C:\xmlparser\XML4J_3_0_1, polecenie SET będzie miało postać następującą (pamiętaj, że wszystko ma być w jednym wierszu):

C:\SET CLASSPATH=%CLASSPATH%;C:\xmlparser\XML4J_3_0_1\xerces.jar;

C:\xmlparser\XML4J_3_0_1\xercesSamples.jar

Zajrzyj do dokumentacji Javy, znajdziesz tam informacje, jak ustawić zmienną CLASSPATH w Twoim systemie. Istnieje jeszcze jedna możliwość zastąpienia tej zmiennej: można użyć w narzędziach javac i java przełącznika -classpath. Oto na przykład sposób skompilowania programu browser.java, gdzie przełącznika używamy do wskazania ścieżki klas (oba polecenia mają być zapisane w pojedynczych wierszach):

%javac -classpath C:\xmlparser\XML4J_3_0_1\xerces.jar;

C:\xmlparser\XML4J_3_0_1\xercesSamples.jar browser.java

%java -classpath C:\xmlparser\XML4J_3_0_1\xerces.jar;

C:\xmlparser\XML4J_3_0_1\xercesSamples.jar browser

Teraz możemy zacząć programowanie. Najpierw napiszemy prosty program analizujący (parsujący) dokument XML.

Tworzenie parsera

Pierwszy przykład wykorzystania XML for Java obejmie parsowanie dokumentu XML i wyświetlanie liczby pewnych jego elementów. Używać będziemy w tym rozdziale modelu XML DOM, użyjemy klasy DOMParser tworzącej w wyniku drzewo DOM W3C.

Przetwarzać będziemy znany już dokument XML, zamówienia.xml

autor pisze, że customer.xml, ale to nieprawda – tamten ma inną strukturę

:

<?xml version="1.0" encoding="iso-8859-2"?>

<DOKUMENT>

  <KLIENT STATUS="Rzetelny kredytobiorca">

    <IMIĘNAZWISKO>

      <NAZWISKO>Smith</NAZWISKO>

      <IMIĘ>Sam</IMIĘ>

    </IMIĘNAZWISKO>

    <DATA>15 października 2001</DATA>

    <ZAMÓWIENIA>

      <POZYCJA>

        <PRODUKT>Pomidory</PRODUKT>

        <ILOŚĆ>8</ILOŚĆ>

        <CENA>5zł</CENA>

      </POZYCJA>

      <POZYCJA>

        <PRODUKT>Pomarańcze</PRODUKT>

        <ILOŚĆ>24</ILOŚĆ>

        <CENA>9.98zł</CENA>

      </POZYCJA>

    </ZAMÓWIENIA>

  </KLIENT>

  <KLIENT STATUS="Kredytobiorca niesolidny">

    <IMIĘNAZWISKO>

      <NAZWISKO>Jones</NAZWISKO>

      <IMIĘ>Polly</IMIĘ>

    </IMIĘNAZWISKO>

    <DATA>20 października 2001</DATA>

    <ZAMÓWIENIA>

      <POZYCJA>

        <PRODUKT>Chleb</PRODUKT>

        <ILOŚĆ>12</ILOŚĆ>

        <CENA>28.80zł</CENA>

      </POZYCJA>

      <POZYCJA>

        <PRODUKT>Jabłka</PRODUKT>

        <ILOŚĆ>6</ILOŚĆ>

        <CENA>6.00zł</CENA>

      </POZYCJA>

    </ZAMÓWIENIA>

  </KLIENT>

  <KLIENT STATUS="Rzetelny kredytobiorca">

<IMIĘNAZWISKO>

      <NAZWISKO>Weber</NAZWISKO>

      <IMIĘ>Bill</IMIĘ>

    </IMIĘNAZWISKO>

    <DATA>25 października 2001</DATA>

    <ZAMÓWIENIA>

      <POZYCJA>

       <PRODUKT>Asparagus</PRODUKT>

        <ILOŚĆ>12</ILOŚĆ>

        <CENA>11.90zł</CENA>

      </POZYCJA>

      <POZYCJA>

        <PRODUKT>Sałata</PRODUKT>

        <ILOŚĆ>6</ILOŚĆ>

        <CENA>31.50zł</CENA>

      </POZYCJA>

    </ZAMÓWIENIA>

  </KLIENT>

</DOKUMENT>

W tym przykładzie będziemy przeglądać plik zamówienia.xml i poinformujemy użytkownika, ile wystąpiło w nim elementów KLIENT.

Na początek importujemy potrzebne nam klasy Javy: org.w3c.dom obsługujące interfejs DOM W3C, takie jak Node czy Element, oraz parser XML for Java org.apache.xerces.parsers.DOMParser:

import org.w3c.dom.*;

import org.apache.xerces.parsers.DOMParser;

  .

  .

  .

Program ten nazwiemy FirstParser.java, wobec czego klasą publiczną tego pliku będzie FirstParser:

import org.w3c.dom.*;

import org.apache.xerces.parsers.DOMParser;

 

public class FirstParser

{

  public static void main(String[] args)

  {

  .

...

Zgłoś jeśli naruszono regulamin