XML – ćwiczenia 11: DOM

Uruchamianie programów

Przykładowe programy (mogą się zmieniać w trakcie kolejnych zajęć):

Katalogi

Zalecam pobranie i rozpakowanie archiwum, pracę w katalogu programy. Własne nowe programy na ćwiczeniach najlepiej tworzyć w osobnym podkatalogu (np. moje), a klasy kompilować też do katalogu class.

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.

Aby skompilować programy: javac -d class/ src/*.java lub javac -d class/ moje/MojProgram.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 darmowe ś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. utworzyć nowy katalog moje (jeśli tak chcecie) i oznaczyć go jako katalog ze źródłami.

Biblioteki

W labie do działania niektórych przykładów potrzebne będą dodatkowe biblioteki z implementacją parsera. Zalecam wykorzystanie biblioteki Xerces.

Tu dostępne są pliki jar, które należy dopisać do ścieżki CLASSPATH (nie wiem czy 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.

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. Spróbuj wykonać z rółnymi konfiguracjami CLASSPATH.

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.

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 wypisywany na wyjście.

Zadanie 3.

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

Zadanie 4.

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

Dokumenty można walidować:

Najprościej walidować dokument względem jego DTD. Walidacja względem XML Schema wymaga niewielkich dodatkowych zabiegów.


Valid XHTML 1.1Valid CSS