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 | 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 pomocí knihovny SAX (Simple API for XML).
Výhody proudového zpracování
[editovat | editovat zdroj]- 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 | 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 pomocí SAX
[editovat | editovat zdroj]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:
- Start document
- Start element: doc
- Start element: pozdrav, attributes: barva (value: blue)
- Characters: Hello, world!
- End element: pozdrav
- End element: doc
- 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 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 | 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ě s ním lze pracovat pomoci knihovny DOM (Document Object Model).
Výhody zpracování pomocí 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í pomocí stromové struktury
[editovat | editovat zdroj]- 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 | editovat zdroj]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 | editovat zdroj]- Java a XML - Pavel Herout, nakladatelství Kopp, rok vydání 2007, ISBN 978-80-7232-307-4
Reference
[editovat | editovat zdroj]