SAX

SAX ( "  Simple API for XML" ) er en måde at sekventielt læse/skrive XML- filer.

Typisk kræver SAX - parsere en fast mængde hukommelse til deres arbejde, men tillader ikke, at indholdet af dokumentet ændres. Det eneste, SAX-parseren gør, er at fortælle den kaldende applikation om de genkendte XML-markup-elementer, der er stødt på, eller de stødte fejl. Kommunikation mellem parseren og den kaldende applikation sker normalt gennem tilbagekaldsfunktioner .

Implementeringer af SAX-parsere kan variere, men generelt er de af samme type, noget i retning af følgende:

// ... Om eksemplet med C++ sproget // Document stream struct Stream { virtual xml_char pop_char () = 0 ; virtuel bool has_data () = 0 ; }; // Klassen, som parseren rapporterer fundet markup-elementer til, strukturen Callback { virtual void doc_start () = 0 ; virtual void doc_end () = 0 ; virtuel void element_start ( streng el_navn ) = 0 ; virtuel void element_end ( streng el_navn ) = 0 ; virtual void attribut ( strengnavn , strengværdi ) = 0 ; _ _ virtuel void text_node ( streng txt ) = 0 ; // ... }; // Selve parseren. -- Temmelig kompliceret at skrive her i fuld struktur Parser { bool parse ( Stream & xml , Callback & cb ); // ... };

Anvendelse:

struct MyFileStream : Stream { ... }; struct MyCallback : Tilbagekald { ... }; MyFileStream _stream ( "some_file.xml" ); MyCallback_cb ; _ parser ; _ bool succes = parser . parse ( _stream , _cb ); // For eksempel indeholder "some_file.xml" følgende tekst: // <html lang="da"> // <b>fed tekst</b> // </html> // Så vil parseren kalde metoderne for "Callback"-klassen i følgende rækkefølge: // _cb.doc_start(); // _cb.element_start("html"); // _cb.attribute( "lang", "da" ); // _cb.element_start("b"); // _cb.text_node( "fed tekst" ); // _cb.element_end("b"); // _cb.element_end("html"); // _cb.doc_end();

SAX-parsere bruges enten til hurtig søgning gennem XML-dokumenter eller under DOM- konstruktion eller til at læse store XML-streams (når DOM-konstruktion kræver for meget hukommelse).

SAX er en hændelsesdrevet XML-parser. Den indeholder en meget lignende hændelseshåndteringsmodel til den i Java. For eksempel kan du i en applet registrere en museklik-hændelseshandler, og i SAX kan du registrere en hændelseshandler til starten og slutningen af ​​element-tags, såsom <name>og </name>. Dette dokument diskuterer IBM XML-parseren. Det er gratis og har offentlig kildekode. Lad os tage et simpelt XML-fileksempel:

<?xml version="1.0" encoding="windows-1251"?> <ordre> <item> <name> Fodbold </name> <price> 15,00 </price> <quantity> 5 </quantity> </ item> </ordre>

Parameteren encoding="windows-1251" er påkrævet for at fungere i Windows-kodning. Lad os analysere et XML-dokument ved hjælp af SAX i nogle få trin. Disse trin er fremhævet i eksempelkoden.

  • Registrering af en XML-parser
  • Oprettelse af en XMLReader-instans
  • Oprettelse af en forekomst af klassen, der er ansvarlig for håndtering af SAX-hændelser
  • Tilslutning af en hændelseshandler til en instans af vores XMLReader
  • Parsing af et dokument ved at sende en XML-fil til en XMLReader. (Dette eksempel bruger filen "order.xml", som indeholder XML-koden vist i begyndelsen af ​​artiklen.)

I eksemplet vil vores klasse udvide DefaultHandler. DefaultHandler er en adapterklasse, der giver os mulighed for kun at håndtere de SAX-hændelser, som vi har brug for, og ikke implementere alle dens hændelser.

pakke xml ; import org.xml.sax.* ; import org.xml.sax.helpers.DefaultHandler ; public class SimpleSax udvider DefaultHandler { private String currentElement = null ; public static void main ( String [] args ) { try { //JDK 5.0 introducerede denne parser, og stien er com.sun.org.apache.xerces.internal.parsers.SAXParser. Klasse c = Klasse . forName ( "org.apache.xerces.parsers.SAXParser" ); XMLReader reader = ( XMLReader ) c . newInstance (); SimpleSax ss = ny SimpleSax (); læser . setContentHandler ( ss ); læser . parse ( "ordre.xml" ); } catch ( Undtagelse e ){ System . ud . println ( e );} } public void startElement ( String uri , String local_name , String raw_name , Attributes amap ) kaster SAXException { currentElement = local_name ; System . ud . println ( "start" + lokalnavn + "fundet" ); } public void endElement ( String uri , String local_name , String raw_name ) kaster SAXException { System . ud . println ( "slut" + lokalnavn + "fundet" ); } public void startDocument () kaster SAXException { System . ud . println ( "start dokument" ); } public void endDocument () kaster SAXException { System . ud . println ( "slut dokument" ); } offentlige void - tegn ( char [] ch , int start , int length ) kaster SAXException { String value = new String ( ch , start , length ); if ( ! Tegn . erISOControl ( værdi . charAt ( 0 ))) { System . ud . println ( "tegn" + værdi + " fundet " + nuværendeElement ); } } }

Se også

Litteratur

  • David Brownell, SAX2, O'Reilly, ISBN 0-596-00237-8
  • W. Scott Means, Michael A. Bodie : The Book of SAX , No Starch Press, ISBN 1-886411-77-8

Links