Programujeme s XML (4.) - DOM v Javě
V předchozích dílech jsme probrali většinu DOMu, a proto by nebyl špatný
nápad naše znalosti shrnout v nějaké ukázce. Dnes se tedy podíváme na
jednoduchý telefoní seznam v XML v Javě.
22.6.2004 15:00 |
Aleš Hakl
| Články autora
| přečteno 10061×
Náš telefoní seznam používá grafickou knihovnu Swing a konkrétně komponentu JTable, jedinou zajímavou částí programu je tedy třída PhoneBookTableModel. Swing se striktně drží MVC modelu, a proto stačí pouze napsat Model, tj. výše uvedenou třídu. Její funkci si tedy dále rozebereme. Náš program bude používat dokument v přibližně takovémto tvaru:
<?xml version="1.0" encoding="UTF-8"?>
<phone-book>
<person>
<first-name>Franta</first-name>
<surname>Novák</surname>
<phone>+420999123456</phone>
<email>franta at novak dot mars</email>
</person>
</phone-book>
Vytváříme nový (prázdný) dokument
public PhoneBookTableModel() {
rowCount = 0;
try {
DOMImplementation impl = DocumentBuilderFactory.newInstance()
.newDocumentBuilder().getDOMImplementation();
doc = impl.createDocument(null,"phone-book",null);
} catch (java.lang.Exception ex) {
// Nelze vytvorit dokument, nema tedy smysl pokracovat v behu
System.out.println("Cannot create Document: "+ex.toString());
System.exit(1);
}
}
Zde dokument vytváříme jiným způsobem než tím, který jsem popisoval v prvním díle. Nejprve pomocí metody getDOMImplementation() třídy DocumentBuilder získáme instanci třídy DOMImplementation, jejíž metodou createDocument() vytvoříme prázdný dokument zadaných vlastností. Parametry jsou: URI jmenného prostoru (nepoužívame jmené prostory, takže null), kvalifikované jméno kořenového elementu a instance třídy DocumentType popisující typ našeho dokumentu (opět, DTD nepoužíváme, takže null).
Načítáme dokument ze souboru
public PhoneBookTableModel(java.lang.String uri) throws PhoneBookException {
try {
DocumentBuilder builder=DocumentBuilderFactory.newInstance().newDocumentBuilder();
doc = builder.parse(uri);
} catch (java.lang.Exception ex) { // Neco je spatne, vicemene nas nezajima co
throw new PhoneBookException("Cannot load document: "+ex.toString());
}
checkDocumentStructure();
}
Opět získáme instanci třídy DocumentBuilder a pomocí její metody parse() načteme dokument. Nakonec zavoláme metodu checkDocumentStructure(), jež zkontroluje že kořenový element je opravdu <phone-book> a spočíta počet položek:
private void checkDocumentStructure() throws PhoneBookException{
if (!doc.getDocumentElement().getNodeName().equals("phone-book"))
throw new PhoneBookException("Wrong document: "+doc.getDocumentElement().getNodeName());
rowCount=doc.getDocumentElement().getElementsByTagName("person").getLength();
fireTableStructureChanged();
}
Během vytváření instance třídy DocumentBuilder by mohlo dojít k nejrůznějším výjimkám, náš příklad je ovšem tak jednoduchý že jakákoli výjimka může znamenat pouze to, že na našem počítači není k dispozici žadný XML parser. Při načítání dokumentu mohou též vzniknout nejrůznější výjimky, většinou se vztahují k IO chybám (neexistující soubor) nebo chybám v dokumentu (chyba syntaxe, chyba při překódování do Unicode, dokument není správně strukturován, dokument vůbec není XML...), proto tuto výjimku obalíme do naší třídy PhoneBookException a vyhodíme dál, v hlavní třídě naší aplikace se uživateli zobrazí jako okno s chybovým hlášením. Poslední variantou je, že výše uvedená metoda checkDocumentStructure() zjistí, že kořenový element není <phone-book>, a tudíž také vyvolá výjimku.
Ukládáme dokument
synchronized public void saveToFile(java.io.File file) throws PhoneBookException {
try {
javax.xml.transform.TransformerFactory.newInstance().newTransformer().
transform(new javax.xml.transform.dom.DOMSource(doc), new javax.xml.
transform.stream.StreamResult(file));
} catch (Throwable ex) { // Neco je spatne, vicemene nas nezajima co
throw new PhoneBookException("Cannot save document");
}
}
Dokument ukládáme přesně způsobem popsaným v prvním díle. Prostřednictvím metody newTransformer() tovární třídy TransformerFactory vytvoříme instanci třídy Transformer, v tomto případě nemá tato instance asociovanou žádnou šablonu, a proto pouze kopíruje vstup na výstup. Poté zavoláme metodu transform(), jejímiž parametry jsou zdroj a výsledek transformace. Jako zdroj použijeme instanci třídy DOMSource pracující nad naším dokumentem doc. A výsledkem bude instance třídy StreamResult obalující soubor, do kterého chceme ukládat.
Příště se podíváme, jak s naším dokumentem doc dále pracujeme, jak odpovídáme na dotazy třídy JTable na hodnoty buněk, jak tyto hodnoty měníme, jak přidáváme, mažeme a měníme pořadí položek.
Verze pro tisk
| |
|
Nejsou žádné diskuzní příspěvky u dané položky.
Příspívat do diskuze mohou pouze registrovaní uživatelé.
|
|

Vyhledávání software

Vyhledávání článků
 Služby
30.7.2010 9:06 /MaReK Olšavský Krátký článek pro pythonýry připomíná zlatá pravidla programování (vztažitelná i na jiné jazyky). Pokračujte odkazem na konci článku :-).
Přidat komentář
29.7.2010 14:39 /Radim Kolář IBM vydala další z řady publikací pro studenty Getting started with open source development. Probírají se licence, obchodní modely, příklady OSS projektů a jak se zapojit do vývoje. Dodatek je věnován krátkému úvodu k DB2 databázi.
Přidat komentář
29.7.2010 7:44 /MaReK Olšavský Při procesu akvizice SUN Microsystems Oraclem se mluvilo především o MySQL a Java platformě, ale Oracle získal mnohem více zajímavých produktů se širokou uživatelskou základnou, například VirtualBox, ke kterému má poněkud macešský přístup. Bude tu VirtualBox pro běžné uživatele, nebo se s ním máme pomalu rozloučit?
Komentářů: 1
29.7.2010 7:08 /MaReK Olšavský Pokud se uživatelé distribucí Fedora a Ubuntu těšili na pozimní vydání, která měla přinést GNOME 3.0, mohou svá očekávání zmírnit, GNOME 3.0 bude opožděno, snad jen do března 2011.
Přidat komentář
28.7.2010 8:49 /MaReK Olšavský Možná pro někoho může být překvapující, že CentOS má majoritní podíl mezi webservery. „Bezplatný RHEL“ trochu překvapivě předstihl vyzdvihovaný Debian i FreeBSD.
Komentářů: 5
Více ...
Přidat zprávičku
 Poslední diskuze
29.7.2010 18:24 /
Hynek (Pichi) Vychodil Re: Kým vyzdvihovaný Debian?
29.7.2010 15:29 /
Radim Kolář Re: Ruchlost kompilace
29.7.2010 12:40 /
Radim Kolář Freebsd
29.7.2010 12:35 /
Radim Kolář mne pada
29.7.2010 12:35 /
Slavomir Rychla maska
Více ...
|