XML-bestand parseren met behulp van SAX Parser



Java biedt talloze manieren om een ​​XML-bestand te ontleden, zoals het ontleden van een XML-bestand met behulp van DOM-parser, SAX-parser of StAX-parser.

Java biedt talloze manieren om een ​​XML-bestand te ontleden. Bijvoorbeeld het ontleden van een XML-bestand met behulp van DOM-parser, SAX-parser of StAX-parser. In dit bericht zullen we zien hoe je een XML-bestand kunt ontleden met SAX-parser





Voordat we ingaan op de details over het parseren van XML-bestanden met SAX-parser, laten we eerst kijken wat het verschil is tussen parseren door verschillende parsers en wanneer we de ene boven de andere moeten kiezen.

SAX-parser - SAX is een afkorting voor Simple API for XML. SAX Parser parseert het XML-bestand regel voor regel en activeert gebeurtenissen wanneer het openingstag, sluitingstag of karaktergegevens in XML-bestand tegenkomt. Dit is de reden waarom SAX-parser een op gebeurtenissen gebaseerde parser wordt genoemd



DOM-parser - DOM is een afkorting voor Document Object Model. In tegenstelling tot SAX-parser laadt DOM-parser het volledige XML-bestand in het geheugen en creëert het een boomstructuur waarbij elk knooppunt in de boom een ​​component van het XML-bestand vertegenwoordigt. Met DOM-parser kunt u knooppunten maken, knooppunten verwijderen, hun inhoud wijzigen en de knooppunthiërarchie doorlopen. DOM biedt maximale flexibiliteit bij het werken met XML-bestanden, maar het brengt kosten met zich mee van een mogelijk grote geheugenvoetafdruk en aanzienlijke processorvereisten in het geval van grote XML-bestanden

StAX Parser - StAX is een afkorting voor Streaming API for XML. Op stream gebaseerde parsers zijn erg handig wanneer uw toepassing geheugenbeperkingen heeft. Bijvoorbeeld een gsm met Java Micro Edition. Evenzo, als uw applicatie meerdere verzoeken tegelijkertijd moet verwerken, bijvoorbeeld een applicatieserver, moet StAX parser worden gebruikt.

Op stream gebaseerde parsing kan verder worden geclassificeerd als:

Pull Parsing - Bij pull-parsing roept de clienttoepassing methoden aan in een XML-parseerbibliotheek wanneer deze moet communiceren met een XML-infoset. Met andere woorden, de klant krijgt alleen XML-gegevens als hij er expliciet om vraagt.



Druk op Parsing - Bij push-parsing is het de XML-parser die XML-gegevens naar de client pusht wanneer deze elementen in een XML-infoset tegenkomt. Met andere woorden, parser stuurt de gegevens naar de applicatie, ongeacht of de applicatie klaar is om deze te gebruiken of niet.

Vergelijking tussen SAX, DOM en StAX parser:

De onderstaande tabel geeft een overzicht van de kenmerken van SAX, DOM en StAX parser

Java_bloge_2

Nu we de verschillende parsers kennen, gaan we kijken hoe we een XML-bestand kunnen parseren met SAX-parser

XML-bestand
Hieronder staat het XML-bestand dat we gaan parseren en Java-objecten gaan construeren

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

Projectstructuur
Hier is de schermafbeelding van de projectstructuur in Eclipse IDE

Hier is de dvd-klasse die een lijst met filmobjecten bevat

pakket co.edureka.parsers.sax import java.util.List public class dvd {private String naam private List movies public String getName () {return name} public void setName (String name) {this.name = name} public List getMovies () {return movies} public void setMovies (lijst met films) {this.movies = films}}

Filmobjecten hebben eigenschappen zoals naam, regisseurs, looptijd (duur) van de film, jaar van uitgave en cast van de film

pakket co.edureka.parsers.sax public class Movie {private String naam private String directors private int runtime private int released private String cast public String getName () {return name} public void setName (String naam) {this.name = name} public String getDirectors () {return directors} public void setDirectors (String directors) {this.directors = directors} 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 () { retourneer 'Film [naam =' + naam + ', regisseurs =' + regisseurs + ', runtime =' + runtime + ', released =' + released + ', cast =' + cast + ']'}}

Implementatie van de SAX Handler:

We gaan de org.xml.sax.helpers uitbreiden. DefaultHandler-klasse die veel callback-methoden biedt en de volgende methoden overschrijft:

startElement () - Deze methode wordt aangeroepen wanneer het begin van een tag wordt aangetroffen

endElement () - Deze methode wordt aangeroepen wanneer het einde van een tag wordt aangetroffen

karakters () - Deze methode wordt aangeroepen wanneer er tekstgegevens worden aangetroffen

Opmerking: er zijn veel andere callback-methoden zoals startDocument (), endDocument () enz. Die indien nodig kunnen worden overschreven.

pakket co.edureka.parsers.sax import java.util.ArrayList import java.util.List import org.xml.sax.Attributes import org.xml.sax.helpers.DefaultHandler openbare klasse SAXHandler breidt DefaultHandler {dvd dvd = nieuwe dvd ( ) ListmovieList = new ArrayList () Movie movie = null String content = null public void startElement (String namespaceURI, String localName, String qname, Attributes attributen) {if (qname.equals ('dvd')) {String dvdName = attributes.getValue ('name') dvd.setName (dvdName)} else if (qname.equals ('movie')) {movie = new Movie ()}} public void endElement (String namespaceURI, String localName, String qname) {switch (qname ) {case 'movie': movieList.add (film) break case 'name': movie.setName (inhoud) break case 'directors': movie.setDirectors (content) break case 'released': movie.setReleased (Integer.parseInt (content)) breakcase 'runtime': movie.setRuntime (Integer.parseInt (content)) breakcase 'cast': movie.setCast (content) breakcase 'dvd': dvd.setMovies (movieList) break}} public void chara cters (char [] ch, int start, int length) {content = new String (ch, start, length)} openbare dvd getDVD () {return dvd}}

Testen van de SAX Handler
Laten we nu onze SAXHandler testen. Hieronder staat de testklasse SAXTest waar we eerst een instantie van SAXParser van SAXParserFactory krijgen en de parse-methode aanroepen die twee argumenten nodig heeft: A File en een handler-instantie.

pakket 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 public class SAXTest {public static void main (String [] args) gooit ParserConfigurationException, SAXException, IOException {SAXParserFactory parserFactor = SAXParserFactory parserFactor = SAXParserFactory parserFactor = SAXParserFactory. parserFactor.newSAXParser () SAXHandler-handler = nieuwe SAXHandler () Padpad = Paths.get ('src / resources', 'movies.xml') parser.parse (path.toFile (), handler) dvd dvd = handler.getDVD ( ) List movies = dvd.getMovies () System.out.println ('DVD Name:' + dvd.getName ()) voor (Movie movie: movies) {System.out.println (movie)}}}

Bij het uitvoeren van de SAXTest-klasse krijgt u de onderstaande uitvoer:

Opmerking : Als u een XML-bestand probeert te ontleden met andere structuren dan movies.xml, dan moet de code in de methoden startElement () en endElement () worden gewijzigd.

Als u de code zelf wilt proberen, download dan de code
[buttonleads form_title = 'Download code' redirect_url = https: //edureka.wistia.com/medias/st5gg7rp15 course_id = 44 button_text = 'Download code']

bel door middel van referentie c ++ voorbeeld

Heeft u een vraag voor ons? Vermeld het in het opmerkingengedeelte en we nemen contact met u op.

Gerelateerde berichten: