XML dokumentumok feldolgozása DOM, SAX, StAX
XML-feldolgozók Az XML-feldolgozók olyan programok, amelyek képesek XML dokumentumokat beolvasni, továbbá hozzáférést biztosítanak a dokumentum tartalmához és szerkezetéhez Az XML-feldolgozót egy másik program például egy Java alkalmazás vezérli Vannak érvényesítő és nem érvényesítő XMLfeldolgozók Mindkét fajta XML-feldolgozó számára kötelező jelezni a specifikációban leírt jólformáltsági megszorításokat sértő olyan hibákat, amelyek a dokumentumegyedben vagy a beolvasott elemzett egyedekben fordulnak elő
Az XML protokollverme
Dokumentum objektum modell Mi a DOM? The Document Object Model is a platform- and language-neutral interface that will allow programs and scripts to dynamically access and update the content, structure and style of documents. The document can be further processed and the results of that processing can be incorporated back into the presented page. A DOM egy API érvényes HTML és jólformált XML dokumentumok manipulálására
DOM példa <table> <tbody> <tr> <td>shady Grove</td> <td>aeolian</td> </tr> <tr> <td>over the River, Charlie</td> <td>dorian</td> </tr> </tbody> </table>
A DOM architektúrája (moduljai)
A DOM jellemzői (1) A DOM a dokumentumot logikailag faként (Node objektumok hierarchiája) kezeli (szerkezeti modell) A DOM objektummodell a klasszikus OO értelemben a dokumentumok (és azok egyes részei) azonossággal, struktúrával, viselkedéssel és kapcsolatokkal is rendelkező objektumok A DOM API kétféle lehetőséget biztosít: egy öröklődési hierarchián alapuló OO megközelítést egy egyszerű (kilapított) nézetet ( everything is a Node )
A DOM jellemzői (2) Alkalmas dokumentumok létrehozására, felépítésére szerkezetének bejárására elemek ill. tartalom hozzáadására, módosítására, törlésére A DOM modulokból áll (ld. architektúra)
DocumentFragment Interfészhierarchia (kékkel a DOM Core, sárgával az XML DOM) Document CharacterData Text CDATASection Attr Element DocumentType Comment NodeList NamedNodeMap DOMException DOMImplementation DOMString DOMTimeStamp
Egy dokumentum DOM-fája <?xml version="1.0"?> <?order alpha ascending?> <period name="renaissance"> <artist>leonardo da Vinci</artist> <artist>michelangelo </artist> <artist>donatello</artist> </period> <!-- renaissance art period -->
DOM Szöveges csomópont: csak elemben! Adat csak szöveges csomópontban! Dokumentumorientált vs. adatorientált DOM: dokumentummodell keverttartalom-modell (elemek, szövegek keverhetőek)
Simple API for XML (SAX) XML dokumentumok eseményvezérelt feldolgozása, callbackek segítségével nem épít belső fát, hanem az egyes elemzési események (kezdőtag, zárótag, ) hatására kezelőmetódusok hívódnak meg, pl.: public void startelement (String uri, String name, String qname, Attributes atts) { if ("".equals (uri)) System.out.println("Start element: " + qname); else System.out.println("Start element: {" + uri + "}" + name); } Kisebb memóriaigény Nem minden feldolgozás végezhető el így (pl. belső referenciák kezelése)
SAX stílusú feldolgozás main(...) A SAX-elemző parse(...) startdocument(...) startelement(...) characters(...) endelement( ) enddocument( )
Streaming API for XML (StAX) Pull parser az alkalmazás vezérli, nem a dokumentum kurzor API az XML dokumentumok bejárása elejétől a végéig eseményiterátor API az XML streamet, mint eseményobjektumok sorozatát tekinti Az XML dokumentum adatai streamként jönnek, feldolgozásuk sorrendben zajlik a dokumentum egy kis része érhető el egyidejűleg az alkalmazás csak akkor jut hozzá adathoz, ha kéri
Streaming API for XML (StAX) Áthidaló megoldás a DOM és a SAX között Hátrány: nehezebb hibakeresés FileInputStream fis = new FileInputStream(file); XMLInputFactory factory = (XMLInputFactory)XMLInputFactory.newInstance(); XMLStreamReader staxxmlreader = (XMLStreamReader) factory.createxmlstreamreader(fis);
Streaming API for XML (StAX) for ( { } int event = staxxmlreader.next(); event!= XMLStreamConstants.END_DOCUMENT; event = staxxmlreader.next()) switch (event) { case XMLStreamConstants.START_DOCUMENT: System.out.println("Start document " + staxxmlreader.getlocalname()); break; case XMLStreamConstants.START_ELEMENT: System.out.println("Start element " + staxxmlreader.getlocalname()); System.out.println("Element text " + staxxmlreader.getelementtext()); break; case XMLStreamConstants.END_ELEMENT: System.out.println("End element " + staxxmlreader.getlocalname()); break; default: break; }
Java API for XML Processing (JAXP) https://jaxp.dev.java.net/ JAXP 1.3 J2SE 5.0 XPath, validáció, adattípusok, Xinclude, JAXP 1.4 J2SE 6 StAX (Streaming API for XML), classloading, factory metódusok Implementációfüggetlen módon, futási időben
JAXP 1.4 Alapcsomagok: org.xml.sax: SAX 2.0 org.w3c.dom: DOM Level 3 javax.xml.parsers: elemzők inicializálása és kezelése javax.xml.transform: transzformátorok (XSLT feldolgozók) inicializálása és kezelése javax.xml.namespace: névterek kezelése javax.xml.stream: StAX javax.xml.xpath: XPath-kifejezések kiértékelése javax.xml.validation: XML dokumentumok validációja
DOM API - alapok
DOM API - alapok javax.xml.parsers.documentbuilderfactory DocumentBuilder newdocument() Document Element, Node, TextNode, stb. Csomagok: org.w3c.dom javax.xml.parsers
DOM egyszerű Java alkalmazás Szükséges osztályok importálása A DOM implementáció lekérése Hibák kezelése Factory példány létrehozása Elemzés (parsing) Validáció: factory.setvalidating(true); Névtérkezelés: factory.setnamespaceaware(true);
SAX API - alapok
SAX API - alapok SAXParserFactory SAXParser objektumot állít elő SAXParser XML adatfoorást foldolgoz és egy DefaultHandler metódusait hívja meg SAXReader Rejtett. XML adatforrást olvas be. DefaultHandler Eseményeket definiál. Alapértelemezett kezelő ContentHandler startdocument, enddocument, startelement, és endelement
SAX API - alapok ErrorHandler error, fatalerror metódusok Validációs kivételek DTDHandler DTD feldolgozásához EntityResolver resolveentity metódus Dokumentum keresés URN - a public identifier - alapján Csomagok a SAX API-ban: org.xml.sax org.xml.sax.ext org.xml.sax.helpers javax.xml.parsers
SAX egyszerű Java alkalmazás Osztályok importálása I/O rendezése ContentHandler interfész implementálása (startdocument, enddocument, startelement, endelement, és characters) Parser felállítása I/O hibák kezelése Output formázása Tartalomesemények kezelése
XSLT API - alapok
XSLT API - alapok TransformerFactory Transformer Csomagok: javax.xml.transform javax.xml.transform.dom javax.xml.transform.dom javax.xml.transform.stream
JDOM Nevével ellentétben nem a DOM-ra épül de könnyen integrálható DOM-mal és SAX-szal Javára optimalizált metódusok túlterhelésének, Collections API-nak, reflection-nek a kihasználása A DOM-mal ellentétben az elemnek van tartalma, nem pedig a szöveges gyermeknek
JDOM Öt csomagból áll: org.jdom org.jdom org.jdom.adapters org.jdom.input org.jdom.output org.jdom.transform
JDOM a feldolgozás menete XML Document SAXBuilder DOMBuilder Direct Build JDOM Document XMLOutputter SAXOutputter DOMOutputter DOM Node(s)
JDOM vs. DOM Document doc = new Document( new Element("rootElement").setText("This is a root element")); Document mydocument = new org.apache.xerces.dom.documentimpl(); Element root = mydocument.createelement("myrootelement"); Text text = mydocument.createtext( "This is a root element"); root.appendchild(text); mydocument.appendchild(root);
Kevert tartalom beolvasása JDOM-mal List mixedcontent = table.getmixedcontent(); Iterator i = mixedcontent.iterator(); while (i.hasnext()) { Object o = i.next(); if (o instanceof Comment) { // Comment has a tostring() out.println("comment: " + o); } else if (o instanceof String) { out.println("string: " + o); } else if (o instanceof Element) { out.println("element: " + ((Element)o).getName()); } // etc }