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ć.
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.
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:
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 jest to:
Charakterystyczne dla DOM są następujące rzeczy:
Strona standardu DOM na W3C.
Rekomendacje (wybrane):
API:
org.w3c.dom
[.*
], javax.xml.parsers
.Zobacz także:
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.
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.
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:
setNamespaceAware(false)
(tak na wszelki wypadek, to jest domyślna wartość),NS
,getNamespaceURI
.Jeśli chcemy pracować na dokumencie uwzględniając przestrzenie nazw, powinniśmy:
setNamespaceAware(true)
,NS
,Nie należy mieszać używania metod z obsługą przestrzeni nazw i bez niej przy dostępie do tego samego drzewa DOM.
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.
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.
Do modyfikacji drzewa służą metody setNodeValue
, removeChild
itp.
Aby dodać nowy węzeł do dokumentu należy:
create...
dokumentu (np. createElement
),appendChild
lub insertBefore
nadwęzła.Plik: LiczbyDOM.
Program liczy sumę wartości tych elementów l
, które znajdują się w elementach grupa
o atrybucie wazne
równym tak
.
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).
Niech program ten dodatkowo w każdej grupie umieszcza wszystkie elementy l
przed wszystkimi elementami s
.
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.
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
.
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.
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
).
Plik: XPathExample.java.
l
z ważnych grup (lub od razu ich węzłów tekstowych) i następnie zsumowanie wartości liczbowych. sum()
)