Parsing af XML-fil ved hjælp af SAX Parser

Java giver adskillige måder at analysere en XML-fil som at parsere en XML-fil ved hjælp af DOM-parser, SAX-parser eller StAX-parser.



Java giver adskillige måder at analysere en XML-fil på. For eksempel parsing af en XML-fil ved hjælp af DOM-parser, SAX-parser eller StAX-parser. I dette indlæg vil vi se, hvordan man analyserer en XML-fil ved hjælp af SAX-parser



Før vi går ind i detaljerne om, hvordan man analyserer XML-filer ved hjælp af SAX-parser, skal vi først se, hvad der er forskellen mellem parsing gennem forskellige parsers, og hvornår man skal vælge den ene over den anden.

SAX Parser - SAX er et akronym for Simple API for XML. SAX Parser analyserer XML-filen linje for linje og udløser begivenheder, når den støder på åbningskode, lukningskode eller karakterdata i XML-fil. Derfor kaldes SAX-parser en begivenhedsbaseret parser



DOM-parser - DOM er et akronym for Document Object Model. I modsætning til SAX-parser indlæser DOM-parser den komplette XML-fil i hukommelsen og opretter en træstruktur, hvor hver node i træet repræsenterer en komponent i XML-filen. Med DOM-parser kan du oprette noder, fjerne noder, ændre deres indhold og krydse nodehierarkiet. DOM giver maksimal fleksibilitet, mens du arbejder med XML-filer, men det medfører en omkostning for potentielt stort hukommelsesfodaftryk og betydelige processorkrav i tilfælde af store XML-filer

StAX Parser - StAX er et akronym for Streaming API til XML. Stream-baserede parsere er meget nyttige, når din applikation har hukommelsesbegrænsninger. For eksempel en mobiltelefon, der kører Java Micro Edition. Tilsvarende, hvis din applikation skal behandle flere anmodninger samtidigt, for eksempel en applikationsserver, skal StAX-parser bruges.

Stream-baseret parsing kan yderligere klassificeres som:

Træk parsing - Ved pull-parsing kræver klientapplikation metoder til et XML-parsingbibliotek, når det skal interagere med et XML-infosæt. Med andre ord får klienten kun XML-data, når den udtrykkeligt beder om det.



Skub parsing - Ved push-parsing er det XML-parseren, der skubber XML-data til klienten, når den møder elementer i et XML-infosæt. Med andre ord sender parser dataene til applikationen, uanset om applikationen er klar til at bruge den eller ej.

Sammenligning mellem SAX, DOM og StAX parser:

Tabellen nedenfor opsummerer funktionerne i SAX, DOM og StAX parser

Java_bloge_2

Nu hvor vi kender til de forskellige parsere, skal vi se, hvordan man parser XML-filer ved hjælp af SAX parser

XML-fil
Nedenfor er den XML-fil, som vi skal analysere og konstruere Java-objekter

The Bourne Identity Doug Liman 119 Matt Damon, Franka Potente 2002 The Bourne Supremacy Paul Greengrass 108 Matt Damon, Franka Potente, Joan Allen 2004 The Bourne Ultimatum Paul Greengrass 115 Matt Damon, Edgar Ramirez, Joan Allen 2007 The Bourne Legacy Tony Gilroy 135 Jeremy Renner , Rachel Weisz, Edward Norton 2012

Projektstruktur
Her er skærmbilledet af projektstruktur i Eclipse IDE

Her er DVD-klassen, der indeholder en liste over filmobjekter

pakke co.edureka.parsers.sax import java.util.List public class DVD {private String name private List film public String getName () {return name} public void setName (String name) {this.name = name} public List getMovies () {returnere film} offentlige ugyldige setMovies (liste film) {this.movies = film}}

Filmobjekt har egenskaber som navn, instruktører, filmens varighed (varighed), udgivet år og rollebesætning af filmen

pakke co.edureka.parsers.sax offentlig klasse Film {privat Strenge navn privat String direktører privat int runtime privat int frigivet privat String cast offentlig String getName () {returnavn} offentlig ugyldigt sætnavn (String navn) {this.name = name} offentlige String getDirectors () {return direktører} offentlige ugyldige setDirectors (String direktører) {this.directors = direktører} offentlige int getRuntime () {return runtime} offentlige ugyldige setRuntime (int runtime) {this.runtime = runtime} public int getReleased ( ) {return released} public void setReleased (int released) {this.released = released} public String getCast () {return cast} public void setCast (String cast) {this.cast = cast} @ Override public String toString () { returner 'Film [name =' + name + ', direktører =' + direktører + ', runtime =' + runtime + ', frigivet =' + frigivet + ', cast =' + cast + ']'}}

Implementering af SAX Handler:

Vi vil udvide org.xml.sax.helpers. StandardHandler-klasse, som giver mange tilbagekaldsmetoder og tilsidesætter følgende metoder:

startElement () - Denne metode kaldes, når der er stød på starten af ​​et tag

endElement () - Denne metode kaldes, når slutningen af ​​et tag er stødt

tegn () - Denne metode kaldes, når der opstår tekstdata

Bemærk: Der er mange andre tilbagekaldsmetoder som startDocument (), endDocument () osv., Der kan tilsidesættes, hvis det kræves.

pakke co.edureka.parsers.sax import java.util.ArrayList import java.util.List import org.xml.sax.Attributter import org.xml.sax.helpers.DefaultHandler offentlig klasse SAXHandler udvider DefaultHandler {DVD dvd = ny DVD ( ) ListmovieList = ny ArrayList () Filmfilm = null Stringindhold = null offentlig ugyldig startElement (String namespaceURI, String localName, String qname, attributte attributter) {if (qname.equals ('dvd')) {String dvdName = attributes.getValue ('name') dvd.setName (dvdName)} ellers hvis (qname.equals ('movie')) {movie = new Movie ()}} public void endElement (String namespaceURI, String localName, String qname) {switch (qname ) {case 'movie': movieList.add (movie) break case 'name': movie.setName (content) break case 'director': movie.setDirectors (content) break case 'released': movie.setReleased (Integer.parseInt (indhold)) break case 'runtime': movie.setRuntime (Integer.parseInt (content)) break case 'cast': movie.setCast (content) break case 'dvd': dvd.setMovies (movieList) break}} offentlig ugyldighed chara cters (char [] ch, int start, int længde) {indhold = ny streng (ch, start, længde)} offentlig DVD getDVD () {return dvd}}

Test af SAX Handler
Lad os nu teste vores SAXHandler. Nedenfor er testklassen SAXTest, hvor vi først får en forekomst af SAXParser fra SAXParserFactory og kalder analyseringsmetoden, der tager to argumenter: En fil og en handlerinstans.

pakke co.edureka.parsers.sax import java.io.IOException import java.nio.file.Path import java.nio.file.Paths import java.util.List import javax.xml.parsers.ParserConfigurationException import javax.xml.parsers .SAXParser import javax.xml.parsers.SAXParserFactory import org.xml.sax.SAXException offentlig klasse SAXTest {offentlig statisk ugyldig main (String [] args) kaster ParserConfigurationException, SAXException, IOException {SAXParserFactory parserFactor = SAXParsFactor = SAXParserFactor = SAXParserFactor parserFactor.newSAXParser () SAXHandler handler = new SAXHandler () Path path = Paths.get ('src / resources', 'movies.xml') parser.parse (path.toFile (), handler) DVD dvd = handler.getDVD ( ) Liste over film = dvd.getMovies () System.out.println ('DVD-navn:' + dvd.getName ()) til (Filmfilm: film) {System.out.println (film)}}}

Når du udfører SAXTest-klassen, får du nedenstående output:

Bemærk : Hvis du prøver at analysere en XML-fil med forskellige strukturer end films.xml, skal koden i metoderne startElement () og endElement () ændres.

Hvis du er interesseret i at prøve koden, skal du downloade koden
[buttonleads form_title = ”Download kode” redirect_url = https: //edureka.wistia.com/medias/st5gg7rp15 course_id = 44 button_text = ”Download kode”]

Har du et spørgsmål til os? Nævn det i kommentarfeltet, så vender vi tilbage til dig.

Relaterede indlæg:

er hadoop let at lære