Java/Zpracování XML v Javě

Jazyk Java společně s XML tvoří symbiózu. Java je přenositelný jazyk a XML je přenositelný formát pro popis dat. Díky této symbióze v Javě existuje velká podpora zpracováni XML pomocí mnoha knihoven.

Nejčastější akce prováděné při zpracování XML jsou:

  • Načítaní XML elementu
  • Generování nových elementů nebo oprava stávajících
  • Zápis do XML dokumentu
  • Transformace XML do jiných formátů, například do HTML

Výše definované akce chceme nějakým způsobem zpracovat. Nejčastěji je zpracujeme pomoci parseru. Parsery se v nějaké podobě nacházejí v knihovnách každého moderního programovacího jazyka. V Javě od verze 1.3 můžeme XML dokumenty zpracovávat pomocí dvou hlavních způsobů:

  • Přístup založený na proudovém zpracování
  • Přístup založený na stromové struktuře

Proudové zpracování

editovat

Princip proudového zpracování je založen na tom, že parser postupně čte XML dokument a pro každou ucelenou část vyvolá událost, kterou my zpracujeme námi implementovaným kódem. V Javě tento přístup je implementován pomocí knihovny SAX (Simple API for XML).

Výhody proudového zpracování

editovat
  • velice rychlé načítání dokumentu
  • malá paměťová náročnost
  • jednoduché pro použití
  • zpracování aktuální části dokumentu nezávisí na již zpracovaných částech
  • každá událost vyvolá korespondující metodu, kterou implementuje programátor

Nevýhody proudového zpracování

editovat
  • dokument je zpracováván sekvenčně, což znamená, že se nelze při čtení vracet zpět
  • princip obsluhy události představuje nízkoúrovňové zpracování, vyžadující množství doplňujícího kódu
  • funkčnost je velice omezena – většinu musí implementovat programátor

Zpracování XML pomocí SAX

editovat

Neboli Simple Api for XML. Toto zpracování je definováno několika rozhraními v Java Core API, popsanými v balíku org.xml.sax. Každá XML značka je v aplikačním kódu reprezentovaná jako událost, přičemž analyzátor čte XML dokument a generuje posloupnost událostí, reprezentující dokument. Programátor píše kód, kterým zpracuje sérii událostí.

Níže lze vidět ukázku zpracování dat pomoci SAX:

<?xml version="1.0" encoding="UTF-8" ?>
<doc>
<pozdrav barva="blue">Hello, world!</pozdrav>
</doc>

SAX parser vygeneruje následující posloupnost události:

  1. Start document
  2. Start element: doc
  3. Start element: pozdrav, attributes: barva (value: blue)
  4. Characters: Hello, world!
  5. End element: pozdrav
  6. End element: doc
  7. End document

Níže lze vidět hlavní kostru kódu zpracovávající XML pomoci SAX. Tento kód vytvoří objekt parseru, pomocí kterého můžeme dokument dále zpracovávat:

// Hlavni kod zpracovani XML pomoci SAX
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;

public class VerifikatorJidloSAX {
    private static final String SOUBOR = "jidlo.xml";
 
    public static void main(String [] args){
        try {
            SAXParserFactory spf = SAXParserFactory.newInstance();
            spf.setValidating(false);
            SAXParser saxLevel1 = spf.newSAXParser();
            XMLReader parser = saxLevel1.getXMLReader();
  
            parser.setErrorHandler(new ChybyZjisteneParserem());
            parser.setContentHandler(new DefaultHandler());   
            parser.parse(SOUBOR);
            System.out.println(SOUBOR + "precten bez chyb");
        } catch(Exception e){
            e.printStackTrace();
        }
    } 
}

Zpracování parsovaného XML dokumentu

editovat

Zpracování dokumentu provedeme tak, že implementujeme z balíčku org.xml.sax několik rozhraní našimi třídami a tyto objekty předáme parseru pomocí jeho set() metod. Mezi jeho nejpoužívanější rozhraní patří:

  • ErrorHandler – reakce na chyby
  • ContentHandler – rozhraní pro zpracování xml elementu
  • Attributes – rozhraní pro zpracování xml atributů.

Nejpouživanější metody jsou z rozhraní ContentHandler:

  • startDocument() vykoná akci na začátku dokumentu
  • startElement() tato metoda je volána při načtení počáteční značky konkrétní xml značky
  • characters() vrací obsah elementu
  • endElement() tato metoda se zavolá při načtení koncové značky

Níže lze vidět ukázkovou implementaci kódu:

public void startElement(String uri, String localName, String qName, Attributes atts){
if(qName.equals(JMENO_ELEMENTU) == true){
    // zde zpracujeme obsah náš element
}

Zpracování XML pomocí stromové reprezentace dokumentu

editovat

Toto zpracování dokumentu je založeno na tom, že se celý XML dokument načte najednou do pamětí a vytvoří se stromová struktura. V Javě s ním lze pracovat pomoci knihovny DOM (Document Object Model).

Výhody zpracování pomocí stromové struktury

editovat
  • celý dokument je najednou dostupný v pamětí
  • při zpracování dokumentu lze libovolně se vracet, přeskakovat a pohybovat se po stromu dokumentu
  • je možné nejen číst XML dokument ale i do něj zapisovat
  • dobrá spolupráce s dotazovacím jazykem XPath
  • stejné rozhraní pro různé programovací jazyky (C++, Java, ….)

Nevýhody zpracování pomocí stromové struktury

editovat
  • malá rychlost načítaní ve srovnání s proudovým zpracováním
  • veliká paměťová náročnost
  • API je hodně obecné a pro některá použiti zbytečně složité

Zpracování XML pomocí DOM

editovat

Neboli Document Object Model. Jedná se o standard připravený konsorciem W3C. Parser DOM načte celý XML dokument do paměti a vytvoří z něj stromovou objektovou reprezentaci.

Níže je ukázka programu, který umožní vytvořit objekty, kterým přečte soubor jidlo.xml:

// Hlavni kod zpracovani XML pomoci DOM
import javax.xml.parsers.*;
import org.w3c.dom.*;

public class VerifikatorJidloDOM {
    private static final String SOUBOR = "jidlo.xml";

    public static void main(String [] args){
        try{
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            dbf.setValidating(false);
            DocumentBuilder builder = dbf.newDocumentBuilder();
            builder.setErrorHandler(new ChybyZjisteneParserem());
            //nacteni dokumentu do pameti
            Document doc = builder.parse(SOUBOR);
            System.out.println(SOUBOR + "precten bez chyb"); 
        } catch(Exception e){
            e.printStackTrace();
        }
    }
}

Kód uvedený výše vytvoří DOM parser a načte XML dokument do pamětí pro další zpracování.

Literatura

editovat

Reference

editovat


Externí odkazy

editovat
  1. Apache XML Project
  2. World Wide Web Consortium