XML – ćwiczenia 12: DOM

Uruchamianie programów

Przykładowe programy (zawartość może się zmieniać w trakcie kolejnych zajęć):

Generalnie klasy w Javie powinny być umieszczane w pakietach, jednak dla uproszczenia przykłady są w pakiecie domyślnym, programy pisane na ćwiczeniach też mogą być.

Uruchamianie z wiersza poleceń

Pod Linuxem można kompilować i uruchamiać programy poleceniami w terminalu. javac -d class/ *.java

Aby uruchomić przykład: java -cp class DomBuilder docOK.xml

Programy można edytować w zwykłym edytorze tekstu, np. Vim, XEmacs, Kate.

Praca w Eclipse

Eclipse to otwarte środowisko programistyczne dla Javy, napisane w Javie. Poprzez wtyczki funkcjonalność można rozszerzać m.in. o obsługę innych języków programowania i takich standardów jak XML i XML Schema.

W labie Eclipse działa i pod Linuxem, i pod Windows. Aby na ćwiczeniach pracować pod Eclipse należy:

  1. rozpakować archiwum z programami,
  2. w Eclipse utworzyć nowy projekt (Java Project), z zewnętrznych źródeł, podając katalog programy,
  3. upewnić się, że katalog src jest oznaczony jako katalog ze źródłami, a katalog class jest katalogiem docelowym dla klas,
  4. własne programy wygodniej będzie zapisywać w innym katalogu, można też w src utworzyć własny pakiet.

Biblioteki

Co prawda w Javie SE 6 jest wszystko, co jest potrzebne do działania przykładów, ale na wszelki wypadek... Do parsowania przydać może się biblioteka Xerces.

Tu dostępne są pliki jar, które należy dopisać do ścieżki CLASSPATH (nie wiem czy koniecznie wszystkie, można poeksperymentować).

DOM – Document Object Model

DOM jest to:

Charakterystyczne dla DOM są następujące rzeczy:

Parsowanie dokumentu i odczyt danych

Przykład 1.

Pliki: DomBuilder, DomSimplePrinter.

Program parsuje podany dokument i wypisuje na wyjście jego węzły tekstowe.

Program z przykładu do dostępu do węzłów używa tylko interfejsu Node, jak widać wystarcza to do odczytania całej zawartości dokumentu.

Można także korzystać z bardziej specyficznych interfejsów jak Element czy Text. Wówczas mamy do dyspozycji więcej specyficznych metod, jak np. getElementsByTagName czy getWholeText, co może być wygodniejsze.

Zadanie 1. Odczyt zawartości

Napisz program (skorzystaj z przykładu) parsujący dokument do postaci DOM i wypisujący na wyjście ten dokument w postaci sformatowanej (większe wcięcia na kolejnych poziomach zagnieżdżenia elementów).

Wystarczy wypisywać elementy z atrybutami i węzły tekstowe, nie należy przejmować się znakami specjalnymi.

Obsługa przestrzeni nazw

Na dokument XML można patrzeć uwzględniając lub nie przestrzenie nazw. Standard DOM (od poziomu 2) posiada wsparcie dla przestrzeni nazw. Między innymi metody, w których wymagane jest podanie nazwy, występują w dwóch wersjach (z końcówką NS i bez niej).

Jeśli chcemy pracować na dokumencie nie uwzględniając przestrzeni nazw, powinniśmy:

Jeśli chcemy pracować na dokumencie uwzględniając przestrzenie nazw, powinniśmy:

Nie należy mieszać używania metod z obsługą przestrzeni nazw i bez niej przy dostępie do tego samego drzewa DOM.

Serializacja dokumentu

Nie trzeba ręcznie wypisywać dokumentów, które są w postaci drzewa DOM. DOM Level 3 zawiera standard Load and Save, który określa interfejs do parsowania i zapisywania dokumentów DOM. Można z niego korzystać w Javie >= 5.0.

Przykład 2. DomLoadSave

Plik: DomLoadSave.

Demonstracja standardu DOM Load and Save. Program parsuje dokument używając LS, modyfikuje drzewo używając obiektu DomModyfikator (dopisuje atrybuty mówiące o liczbie dzieci) i zapisuje dokument używając LS.

Przykład 3.

Plik: PrintDomImplementations.

Program wypisuje dostępne implementacje DOM.

Modyfikacja danych

Do modyfikacji drzewa służą metody setNodeValue, removeChild itp.

Aby dodać nowy węzeł do dokumentu należy:

  1. stworzyć nowy węzeł jedną z metod create... dokumentu (np. createElement),
  2. dodać węzeł do dokumentu wywołując metodę appendChild lub insertBefore nadwęzła.

Przykład 4. LiczbyDOM

Plik: LiczbyDOM.

Program liczy sumę wartości tych elementów l, które znajdują się w elementach grupa o atrybucie wazne równym tak.

Zadanie 2. Dodawanie nowych węzłów

Na podstawie LiczbyDOM napisz program, który modyfikuje dokument: do każdej grupy dodaje podelement suma o wartości równej sumie wartości wszystkich elementów l zawartych w tej grupie. Zmodyfikowany dokument jest na końcu wypisywany (np. na standardowe wyjście).

Zadanie 3. Zmiana struktury

Niech program ten dodatkowo w każdej grupie umieszcza wszystkie elementy l przed wszystkimi elementami s.

Zadanie 4. Dowolne dokumenty (rezerwowe)

Napisz program, który (dla dowolnego dokumentu) dodaje do każdego elementu atrybut liczba_potomkow, w którym zapisana jest liczba wszystkich węzłów będących potomkami (nie tylko dziećmi) danego elementu.

Tworzenie dokumentu od zera

Nie zawsze dokument chcemy odczytać. Czasami możemy chcieć utworzyć drzewo DOM od zera. Służy do tego klasa DOMImplementation, którą można uzyskać z DocumentBuilder albo za pomocą klas pakietu org.w3c.dom.bootstrap.

Walidacja

Najprościej walidować dokument względem jego DTD podczas parsowania.

Walidacja względem XML Schema wymaga niewielkich dodatkowych zabiegów, ale jest też zdefiniowana bardziej ogólnie - można walidować istniejące drzewo DOM.

Ewaluacja XPath

JAXP 1.4 obejmuje wsparcie dla XPath 1.0. Klasy i interfejsy stanowiące wsparcie dla XPath zostały umieszczone w pakiecie javax.xml.xpath. Do obliczania wyrażeń służą obiekty implementujące interfejs XPath, można je uzyskać z obiektu klasy XPathFactory.

Wartość wyrażenia XPath może być obliczona dla dokumentu dostępnego jako plik (lub ogólnie ciąg znaków) lub jako drzewo DOM. W pierwszym przypadku w celu obliczenia jednego wyrażenia parsowany jest cały dokument, co zwykle nie jest efektywnym rozwiązaniem, drugi przypadek jest możliwy do osiągnięcia tylko dla dokumentów mieszczących się w pamięci. Wyrażenie może być także obliczone w kontekście konkretnego węzła – należy go podać jako węzeł DOM.

Wynik wyrażenia można odebrać jako obiekt Javy typu najbardziej odpowiedniego dla wskazanego typu XPath (metoda typu Object). Węzły zwracane są jako węzły DOM. Typy atomowe w XPath 1.0 to jedynie liczby, napisy i boolean – zwracane są odpowiednie obiekty Javy.

Wynik można też odebrać zrzutowany od razu na String (metoda typu String).

Przykład 7.

Plik: XPathExample.java.

Zadanie 5.

  1. Napisz program sumujący liczby z ważnych grup, który robi to poprzez wybranie ścieżką XPath wszystkich elementów l z ważnych grup (lub od razu ich węzłów tekstowych) i następnie zsumowanie wartości liczbowych.
  2. Spróbuj (nie było to testowane) napisać od razu ścieżkę, która liczy sumę (funkcja sum())

Valid XHTML 1.1Valid CSS