XML – ćwiczenia 11: DOM

Uruchamianie programów

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

Uruchamianie z wiersza poleceń

Pod Linuxem można kompilować i uruchamiać programy poleceniami w terminalu. javac -d bin `find -name *.java`

Aby uruchomić przykład: java -cp bin other_examples.dom.DomBuilder docOK.xml

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

Praca w Eclipse

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 zaimportować projekt z rozpakowanego katalogu (File > Import > General > Existing projects into workspace).

Własne programy sugeruję zapisywać w osobnych pakietach.

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 Document, Element czy Text. Wówczas mamy do dyspozycji więcej specyficznych metod, jak np. getDocumentElement czy getElementsByTagName, co może być wygodniejsze.

Przykład 2. Przykład z wykładu

Pliki: StaffDOM.java, StaffDOM_HighLevel.java.

Program liczy sumę zarobków osób z podanego stanowiska. W jednej wersji używany jest tylko generyczny interfejs Node, w drugiej wersji interfejs Element i metoda getElementsByTagName.

Zadanie 1. Odczyt zawartości

Napisz program czytający dokument taki jak sklep.xml i wypisujący wszystkie kategorie zdefiniowane w sklepie, a dla każdej kategorii nazwę i cenę najtańszego towaru w tej kategorii.


Write a program reading documents such as sklep.xml which will print all categories and, for each category: the name (nazwa) and the price (cena) of the cheapest article (towar) in the given category.

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.

Zadanie 2. Przestrzenie nazw

Do programu z zadania 1 dodaj obsługę przestrzeni nazw tak, aby program czytał dokumenty takie jak sklep_ns.xml.

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 3. 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 4.

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.

Zadanie 3. Dodawanie nowych węzłów

Na podstawie napisanego programu stwórz program czytający dokument taki jak sklep.xml, dodający do poszczególnych elementów kategoria podelement najtanszy-towar z podelementami nazwa i cena, zawierający właściwe dane i zapisujący zmieniony dokument do nowego pliku.

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.

Zadanie 4. Walidacja

  1. Dodaj walidację dokumentu sklep podczas wczytywania.
  2. Dodaj walidację Validator-em zmienionego dokumentu przed zapisaniem.
  3. Zmień schemat tak, aby wynikowe dokumenty były traktowane jako poprawne (najbardziej elegancko byłoby stworzyć dwie wersje schematu - jedną dla wejścia, drugą dla wyjścia).

Valid XHTML 1.1Valid CSS