LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> 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 22100×

Hlavní okno telefoního seznamu 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

pridej.cz

 

DISKUZE

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ů

8.5.2016 17:19 /Redakce Linuxsoft.cz
PR: Dne 26.5.2016 proběhne v Praze konference Cloud computing v praxi. Tématy bude např. nejnovější trendy v oblasti cloudu a cloudových řešení, cloudové služby, infrastruktura cloudu, efektivní využití cloudu, možné nástrahy cloudů a jak se jim vyhnout
Přidat komentář

21.4.2016 8:01 /František Kučera
Spolek OpenAlt zve na 127. distribuovaný sraz příznivců svobodného softwaru a otevřených technologií (hardware, 3D tisk, SDR, DIY, makers…), který se bude konat ve čtvrtek 28. dubna od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

2.3.2016 22:41 /Ondřej Čečák
Letošní ročník konference InstallFest již tento víkend!
Přidat komentář

14.2.2016 16:39 /Redakce Linuxsoft.cz
O víkendu 5. a 6. března 2016 proběhne na pražském Strahově 8. ročník tradiční konference InstallFest. Celkem za dva dny uvidíte ​30 přednášek​ a ​6 workshopů.
Přidat komentář

5.2.2016 17:38 /Petr Ježek
Utilitka z XFce "xfce4-power-manager" nejen umožňuje nastavení lhůty pro uspání či hybernaci, ale i zapínání a vypínání prezentačního módu pro nerušené sledování videí. Stačí ji nastavit v každém vybavenějším panelu a v jakémkoli nontiled WM/DE.
Přidat komentář

10.1.2016 11:32 /Pavel `Goldenfish' Kysilka
LinuxMarket změnil provozovatele. Nově jej provozuje Marek Pszczolka. Více info a detaily #1 a #2.
Přidat komentář

29.12.2015 11:38 /Ondřej Čečák
Ještě posledních pár dní můžete přidávat příspěvky nebo nápady na Install Fest 2016, který se bude konat 5. a 6. března 2016.
Přidat komentář

8.12.2015 11:36 /Petr Ježek
Logické se stává realitou. LibreOffice a Thunderbird se mají dle článku na Redditu stát protiváhou MS řešení (MS Office a Outlook).
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

10.6.2016 21:10 / pavel riha
FreeBSD 10.3 a virtualizace

8.6.2016 21:56 / Milan Gallas
Nevalidní prefix m

7.5.2016 14:58 / Teodor Komárek
Soubory

20.4.2016 0:07 / Jakub Cleing
Sázkový panel PHP FUSION

9.4.2016 9:43 / jiwopene@gmail.com
Re: problém s dpkg a nemožností instalovat

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2016) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze