Zpracování XML v Javě

Z Wikipedie, otevřené encyklopedie

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 elementu 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 | editovat zdroj]

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 pomoci knihovny SAX(Simple API for XML)

Výhody proudového zpracování[editovat | editovat zdroj]

  • velice rychlé načítaní dokumentu
  • malá paměťová náročnost
  • jednoduché pro použiti
  • 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 | editovat zdroj]

  • 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 pomoci SAX[editovat | editovat zdroj]

Neboli Simple Api for XML. Toto zpracování je definováno několika rozhraními v Java Core API popsané 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ázka 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 | editovat zdroj]

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 pomoci 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 pomoci stromové reprezentace dokumentu[editovat | editovat zdroj]

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ě lze s ním pracovat pomoci knihovny DOM(Document Object Model).

Výhody zpracování pomoci stromové struktury[editovat | editovat zdroj]

  • 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í pomoci stromové struktury[editovat | editovat zdroj]

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

Zpracování XML pomoci DOM[editovat | editovat zdroj]

Neboli Document Object Model. Jedna 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 | editovat zdroj]

Reference[editovat | editovat zdroj]

  1. Apache XML Project
  2. World Wide Web Consortium