XML adatkezelés I. Az SAX szabvány Dr. Kovács László Miskolci Egyetem Általános Informatikai Tanszék
SAX
XML adatok kezelési lehetőségei
szövegszerkesztő SAX API XML
DOM API XSL XQUERY SAX
SAX Az XML dokumentumok feldolgozó felülete SAX = Simple API for XML Az értelmező szekvenciálisan feldolgozza az XML dokumentumot, s minden fontosabb eseményről értesíti a kezelő programot callback mechanizmussal
XML startElement SAX feldolgozó
endElement
Kezelő program
SAX
1
SAX A feldolgozó biztosít egy osztálykönyvtárt, melyen keresztül lehet definiálni és elérhetővé tenni a callback kezelő függvényeket. Java minta környezet Fontosabb lépések: - dokumentum olvasó létrehozása - tartalomkezelő keret létrehozása - az eseménykezelő metódusok létrehozása - hibakezelő metódusok létrehozása
SAX
SAX
element
Alma Korte
attribute text Esemény kezelők
XML Esemény érzékelő SAX
SAX feldolgozó
SAX SAX kapcsolódási felületei: - Parser - DocumentHandler - AttributeList - ErrorHandler - Entity Resolver - Locator - DTDHandler
XML
Parser
DocumentHandler AttributeList Kliens
Entity Resolver
ContentHandler Element
Text SAX
2
SAX Dokumentum olvasó létrehozása import org.xml.sax.XMLReader; import org.apache.xerces.parsers.SAXParser ; .. public class SAXERT { public void kezelo(String URI) { ... XMLReader parser = new SAXParser(); ….. } public static void main(String[] args) { SAXERT pdemo = new SAXERT(); pdemo.kezelo(”...uri…”); } } SAX
SAX Dokumentum értelmezési folyamatának elindítása import org.xml.sax.SAXException; .. public void kezelo(String URI) { … try { XMLReader parser = new SAXParser(); parser.parse(); } catch (SAXException e) { } }
SAX
SAX Tartalom kezelő keret létrehozása import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.Locator; ... Class Skezelo implements ContentHandler{ …kezelo metodusok } public void kezelo(String URI) { XMLReader parser = new SAXParser(); Skezelo Shand = new Skezelo(); parser.setContentHandler(Shand); parser.parse(uri); } SAX
3
SAX Esemény kezelő metódusok létrehozása Class Skezelo implements ContentHandler{ public void startDocument() { ... } throws SAXException (); public void endDocument() { ... } throws SAXException (); public void startElement() { ... } throws SAXException (); ... } SAX
SAX Esemény kezelő metódusok létrehozása - dokumentumban aktuális pozíció - dokumentum kezdete - dokumentum vége - elem kezdete - elem vége - prefix feldolgozás - karakter rész elérés - entity rész - direktivák - névterek - attributumok void startElement(String name, AttributeList atts) SAX
SAX Esemény helyének lekérdezése public void setDocumentLocator (Locator loc) { } Minden eseménykor meghívódik, megadva az aktuális Locator elemet
SAX
4
SAX Dokumentum kezdetének és végének eseménye public void startDocument () throws SAXException{ } public void endDocument () throws SAXException{ }
SAX
SAX Feldolgozási utasítás eseménye: public void processingInstruction (String feldolgozo, String adat) throws SAXException{ } Névtér definíció kezdete: public void startPrefixMapping (String alias, String névter) throws SAXException{ } Névtér definíció vége: public void endPrefixMapping (String alias) throws SAXException{ } SAX
SAX Elem kezdete: public void startElement (String névtér, String lokálisnév, String teljesnév, Attributes elemjellemzők) throws SAXException{ }
Elem vége: public void endElement (String névtér, String lokálisnév, String teljesnév) throws SAXException{ }
SAX
5
SAX Karakterek észlelése: public void characters (char[] karakterlánc, int kezdőpozíció, int végpozíció) throws SAXException{ }
Átugrott egyedek: public void skippedEntity (String név) throws SAXException{ }
SAX
SAX mintapélda public static void main(String[] args) { xmlfo xmlfo = new xmlfo(); XMLSAX doksi = new XMLSAX(); doksi.kezelo("c:\\jdeveloper\\...proba1.xml"); }
SAX
import org.xml.sax.SAXException; import org.xml.sax.XMLReader; public class XMLSAX { public void kezelo(String args) { try { XMLReader parser = new SAXParser(); Skezelo Shand = new Skezelo(); parser.setContentHandler(Shand); parser.parse(args); } catch (SAXException e) { System.out.println(e.getMessage()); } catch (IOException e) { System.out.println(e.getMessage()); } } SAX }
6
import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.Locator; import org.xml.sax.SAXException; public class Skezelo implements ContentHandler { private Locator loc; public Skezelo() { } public void setDocumentLocator (Locator lloc) { this.loc = lloc; } public void startDocument() throws SAXException { System.out.println("sor:" + this.loc.getLineNumber()); System.out.println("dok. kezdet"); SAX }
public void endDocument() throws SAXException { System.out.println("sor:" + this.loc.getLineNumber()); System.out.println("dok. veg"); } public void startPrefixMapping(String prefix, String uri) throws SAXException { System.out.println("sor:" + this.loc.getLineNumber()); System.out.println("prefix:" + prefix +" : " + uri); } public void endPrefixMapping(String prefix) throws SAXException { System.out.println("sor:" + this.loc.getLineNumber()); System.out.println("prefix vege:" + prefix); } SAX
public void processingInstruction (String target, String data) throws SAXException { System.out.println("sor:" + this.loc.getLineNumber()); System.out.println("Feld. utasitas:" + target); } public void startElement (String namespaceuri, String localname, String rawname, Attributes atts) throws SAXException { System.out.println("sor:" + this.loc.getLineNumber()); System.out.println ("elemkezdet:"+localname); for (int i=0; i
7
public void endElement (String namespaceuri, String localname, String rawname) throws SAXException { System.out.println("sor:" + this.loc.getLineNumber()); System.out.println("elem vege:"+ localname); } public void characters (char[] ch, int start, int length) throws SAXException { String ered = new String(); for (int i=start; i<start+length;i++) { ered += ch[i]; } System.out.println("sor:" + this.loc.getLineNumber()); System.out.println(ered); } SAX
8