Analysera XML-fil med SAX Parser



Java ger många sätt att analysera en XML-fil som att analysera en XML-fil med DOM-parser, SAX-parser eller StAX-parser.

Java erbjuder flera sätt att analysera en XML-fil. Till exempel analysera en XML-fil med DOM-parser, SAX-parser eller StAX-parser. I det här inlägget kommer vi att se hur man analyserar en XML-fil med SAX-parser





Innan vi läser in detaljerna om hur man analyserar XML-filer med SAX-parser, ska vi först se vad som är skillnaden mellan att analysera genom olika parsers och när man ska välja varandra.

SAX Parser - SAX är en förkortning för Simple API for XML. SAX Parser tolkar XML-filen rad för rad och utlöser händelser när den möter öppningstagg, stängningstagg eller teckendata i XML-fil. Det är därför SAX-parser kallas en händelsebaserad parser



DOM Parser - DOM är en förkortning för Document Object Model. Till skillnad från SAX-parser laddar DOM-parser hela XML-filen i minnet och skapar en trädstruktur där varje nod i trädet representerar en komponent i XML-filen. Med DOM-parser kan du skapa noder, ta bort noder, ändra deras innehåll och korsa nodhierarkin. DOM ger maximal flexibilitet när du arbetar med XML-filer men det medför en kostnad för potentiellt stort minnesavtryck och betydande processorbehov vid stora XML-filer

exempel på instansvariabel i java

StAX Parser - StAX är en förkortning för Streaming API för XML. Strömbaserade parsers är mycket användbara när din applikation har minnesbegränsningar. Till exempel en mobiltelefon som kör Java Micro Edition. På samma sätt, om din applikation behöver behandla flera förfrågningar samtidigt, till exempel en applikationsserver, bör StAX-parser användas.

Strömbaserad analysering kan vidare klassificeras som:

Dra Parsing - Vid pull-parsing kräver klientapplikation metoder i ett XML-parsingsbibliotek när det behöver interagera med ett XML-infoset. Med andra ord får klienten bara XML-data när den uttryckligen ber om det.



Push Parsing - Vid push-parsing är det XML-parsern som skickar XML-data till klienten när den stöter på element i en XML-infoset. Med andra ord skickar parser data till applikationen oavsett om applikationen är redo att använda den eller inte.

Jämförelse mellan SAX, DOM och StAX parser:

Tabellen nedan sammanfattar funktionerna i SAX, DOM och StAX parser

Java_bloge_2

Nu när vi känner till de olika tolkarna, låt oss se hur man analyserar XML-filer med SAX-tolkaren

XML-fil
Nedan är XML-filen som vi ska analysera och konstruera Java-objekt

korsa webbläsartestning med selen
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
Här är skärmdumpen av projektstrukturen i Eclipse IDE

Här är DVD-klassen som innehåller en lista över filmobjekt

paket co.edureka.parsers.sax import java.util.List public class DVD {private String name private Lista filmer public String getName () {return name} public void setName (String name) {this.name = name} public List getMovies () {return films} public void setMovies (Lista filmer) {this.movies = films}}

Filmobjekt har egenskaper som namn, regissörer, filmens längd (varaktighet), utgivningsår och filmen

paket co.edureka.parsers.sax allmän klass Film {privat Strängnamn privat Strängregissörer privat int runtime privat int släppt privat Strängbesättning offentlig Sträng getName () {returnamn} offentligt ogiltigt uppsättningsnamn (Strängnamn) {this.name = name} offentliga String getDirectors () {returnera direktörer} offentliga ogiltiga setDirectors (String direktörer) {this.directors = regissörer} public int getRuntime () {return runtime} public void 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 () { returnera 'Film [name =' + name + ', regissörer =' + regissörer + ', runtime =' + runtime + ', släppt =' + släppt + ', cast =' + cast + ']'}}

Implementering av SAX Handler:

Vi kommer att utöka org.xml.sax.helpers. DefaultHandler-klass som ger många återuppringningsmetoder och åsidosätter följande metoder:

startElement () - Den här metoden kallas när en tagg startar

endElement () - Den här metoden kallas när slutet av en tagg påträffas

tecken() - Denna metod kallas när vissa textdata påträffas

Obs! Det finns många andra återuppringningsmetoder som startDocument (), endDocument () etc. som kan åsidosättas vid behov.

paket co.edureka.parsers.sax importera java.util.ArrayList importera java.util.List importera org.xml.sax.Attribut importera org.xml.sax.helpers.DefaultHandler allmän klass SAXHandler utökar DefaultHandler {DVD dvd = ny DVD ( ) ListmovieList = ny ArrayList () Filmfilm = null Stringinnehåll = null offentligt ogiltigt startElement (String namespaceURI, String localName, String qname, Attribut attribut) {if (qname.equals ('dvd')) {String dvdName = attributes.getValue ('name') dvd.setName (dvdName)} annars om (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 (innehåll)) break case 'runtime': movie.setRuntime (Integer.parseInt (content)) break case 'cast': movie.setCast (content) break case 'dvd': dvd.setMovies (movieList) break}} offentligt ogiltigt chara cters (char [] ch, int start, int length) {content = new String (ch, start, length)} public DVD getDVD () {return dvd}}

Testa SAX Handler
Låt oss nu testa vår SAXHandler. Nedan visas testklassen SAXTest där vi först får en instans av SAXParser från SAXParserFactory och kallar analysmetoden som tar två argument: En fil och en hanterarinstans.

paket 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 allmän klass SAXTest {public static void main (String [] args) kastar 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 ( ) Lista filmer = dvd.getMovies () System.out.println ('DVD-namn:' + dvd.getName ()) för (Filmfilm: filmer) {System.out.println (film)}}}

När du kör SAXTest-klassen får du utdata nedan:

exempel på instansvariabel i java

Notera : Om du försöker analysera en XML-fil med olika strukturer än films.xml måste koden i metoderna startElement () och endElement () ändras.

Om du är intresserad av att prova koden själv ladda ner koden
[buttonleads form_title = ”Ladda ner kod” redirect_url = https: //edureka.wistia.com/medias/st5gg7rp15 course_id = 44 button_text = ”Ladda ner kod”]

Har du en fråga till oss? Vänligen nämna det i kommentarfältet så återkommer vi till dig.

Relaterade inlägg: