Analysieren von XML-Dateien mit SAX Parser



Java bietet zahlreiche Möglichkeiten zum Parsen einer XML-Datei, z. B. das Parsen einer XML-Datei mit DOM-Parser, SAX-Parser oder StAX-Parser.

Java bietet zahlreiche Möglichkeiten zum Parsen einer XML-Datei. Beispiel: Parsen einer XML-Datei mit DOM-Parser, SAX-Parser oder StAX-Parser. In diesem Beitrag erfahren Sie, wie Sie eine XML-Datei mit dem SAX-Parser analysieren





Bevor wir uns mit den Details zum Parsen von XML-Dateien mit dem SAX-Parser befassen, wollen wir zunächst sehen, was der Unterschied zwischen dem Parsen durch verschiedene Parser und dem Zeitpunkt ist, zu dem einer über den anderen ausgewählt werden soll.

SAX Parser - SAX ist eine Abkürzung für Simple API for XML. SAX Parser analysiert die XML-Datei zeilenweise und löst Ereignisse aus, wenn in der XML-Datei Daten zum Öffnen von Tags, Schließen von Tags oder Zeichen gefunden werden. Aus diesem Grund wird der SAX-Parser als ereignisbasierter Parser bezeichnet



DOM-Parser - DOM ist eine Abkürzung für Document Object Model. Im Gegensatz zum SAX-Parser lädt der DOM-Parser die gesamte XML-Datei in den Speicher und erstellt eine Baumstruktur, in der jeder Knoten im Baum eine Komponente der XML-Datei darstellt. Mit dem DOM-Parser können Sie Knoten erstellen, Knoten entfernen, deren Inhalt ändern und die Knotenhierarchie durchlaufen. DOM bietet maximale Flexibilität bei der Arbeit mit XML-Dateien, ist jedoch mit Kosten für potenziell großen Speicherbedarf und erheblichen Prozessoranforderungen bei großen XML-Dateien verbunden

StAX Parser - StAX ist eine Abkürzung für Streaming API for XML. Stream-basierte Parser sind sehr nützlich, wenn Ihre Anwendung Speicherbeschränkungen aufweist. Zum Beispiel ein Mobiltelefon mit Java Micro Edition. Wenn Ihre Anwendung mehrere Anforderungen gleichzeitig verarbeiten muss, z. B. einen Anwendungsserver, sollte der StAX-Parser verwendet werden.

Stream-basiertes Parsen kann weiter klassifiziert werden als:

Parsing ziehen - Beim Pull-Parsing fordert die Clientanwendung Methoden für eine XML-Parsing-Bibliothek auf, wenn sie mit einem XML-Infoset interagieren muss. Mit anderen Worten, der Client erhält XML-Daten nur, wenn er explizit danach fragt.



Parsing drücken - Beim Push-Parsing ist es der XML-Parser, der XML-Daten an den Client sendet, wenn er auf Elemente in einem XML-Infoset stößt. Mit anderen Worten, der Parser sendet die Daten an die Anwendung, unabhängig davon, ob die Anwendung bereit ist, sie zu verwenden oder nicht.

Vergleich zwischen SAX-, DOM- und StAX-Parser:

In der folgenden Tabelle sind die Funktionen des SAX-, DOM- und StAX-Parsers zusammengefasst

Java_bloge_2

Nachdem wir nun die verschiedenen Parser kennen, sehen wir uns an, wie XML-Dateien mit dem SAX-Parser analysiert werden

XML-Datei
Unten finden Sie die XML-Datei, die wir analysieren und Java-Objekte erstellen werden

Die Bourne-Identität Doug Liman 119 Matt Damon, Franka Potente 2002 Die Bourne-Vorherrschaft Paul Greengrass 108 Matt Damon, Franka Potente, Joan Allen 2004 Das Bourne-Ultimatum Paul Greengrass 115 Matt Damon, Edgar Ramirez, Joan Allen 2007 Das Bourne-Erbe Tony Gilroy 135 Jeremy Renner , Rachel Weisz, Edward Norton 2012

Projektstruktur
Hier ist der Screenshot der Projektstruktur in Eclipse IDE

Was ist Logger in Java

Hier ist die DVD-Klasse, die eine Liste von Filmobjekten enthält

Paket co.edureka.parsers.sax import java.util.List öffentliche Klasse DVD {privater Stringname private Liste Filme public String getName () {Rückgabewert} public void setName (Stringname) {this.name = name} öffentliche Liste getMovies () {Filme zurückgeben} public void setMovies (Filme auflisten) {this.movies = movies}}

Filmobjekte haben Eigenschaften wie Name, Regie, Laufzeit (Dauer) des Films, Erscheinungsjahr und Besetzung des Films

package co.edureka.parsers.sax public class Film {privater Stringname private Stringdirektoren private int Laufzeit private int freigegebener privater String cast public String getName () {Rückgabewert} public void setName (Stringname) {this.name = name} public String getDirectors () {Direktoren zurückgeben} public void setDirectors (Zeichenfolgen Direktoren) {this.directors = Direktoren} public int getRuntime () {Laufzeit zurückgeben} public void setRuntime (int Laufzeit) {this.runtime = Laufzeit} public int getReleased ( ) {return freigegeben} public void setReleased (int freigegeben) {this.released = freigegeben} public String getCast () {return cast} public void setCast (String cast) {this.cast = cast} @Override public String toString () { return 'Film [Name =' + Name + ', Regisseure =' + Regisseure + ', Laufzeit =' + Laufzeit + ', freigegeben =' + freigegeben + ', Besetzung =' + Besetzung + ']'}}

Implementierung des SAX-Handlers:

Wir werden die org.xml.sax.helpers erweitern. DefaultHandler-Klasse, die viele Rückrufmethoden bereitstellt und die folgenden Methoden überschreibt:

startElement () - Diese Methode wird aufgerufen, wenn ein Tag gestartet wird

endElement () - Diese Methode wird aufgerufen, wenn das Ende eines Tags erreicht ist

Zeichen() - Diese Methode wird aufgerufen, wenn Textdaten gefunden werden

Hinweis: Es gibt viele andere Rückrufmethoden wie startDocument (), endDocument () usw., die bei Bedarf überschrieben werden können.

Paket co.edureka.parsers.sax import java.util.ArrayList import java.util.List import org.xml.sax.Attributes import org.xml.sax.helpers.DefaultHandler öffentliche Klasse SAXHandler erweitert DefaultHandler {DVD dvd = new DVD ( ) ListmovieList = new ArrayList () Movie movie = null String content = null public void startElement (String namespaceURI, String localName, String qname, Attributattribute) {if (qname.equals ('dvd')) {String dvdName = attribute.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 (movie) break case 'name': movie.setName (content) break case 'Directors': movie.setDirectors (content) break case 'freigegeben': movie.setReleased (Integer.parseInt (Inhalt)) Pausenfall 'Laufzeit': movie.setRuntime (Integer.parseInt (Inhalt)) Pausenfall 'Besetzung': movie.setCast (Inhalt) Pausenfall 'DVD': dvd.setMovies (Filmliste) Pause}} public void chara cters (char [] ch, int start, int length) {content = new String (ch, start, length)} öffentliche DVD getDVD () {return dvd}}

Testen des SAX-Handlers
Testen wir jetzt unseren SAXHandler. Unten finden Sie die Testklasse SAXTest, in der wir zuerst eine Instanz von SAXParser von SAXParserFactory abrufen und die Analysemethode aufrufen, die zwei Argumente akzeptiert: Eine Datei- und eine Handlerinstanz.

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 öffentliche Klasse SAXTest {public statisch void main (String [] args) löst ParserConfigurationException, SAXException, IOException {SAXParserFactory parserFactor = SAXParserFactory.new = parserFactor.newSAXParser () SAXHandler-Handler = neuer SAXHandler () Pfad path = Paths.get ('src / resources', 'movies.xml') parser.parse (path.toFile (), Handler) DVD dvd = handler.getDVD ( ) Liste Filme = dvd.getMovies () System.out.println ('DVD Name:' + dvd.getName ()) für (Film Film: Filme) {System.out.println (Film)}}}

Beim Ausführen der SAXTest-Klasse erhalten Sie die folgende Ausgabe:

Hinweis : Wenn Sie versuchen, eine XML-Datei mit anderen Strukturen als movies.xml zu analysieren, muss der Code in den Methoden startElement () und endElement () geändert werden.

Cross-Browser-Tests mit Selen

Wenn Sie den Code selbst ausprobieren möchten, laden Sie ihn herunter
[buttonleads form_title = 'Code herunterladen' redirect_url = https: //edureka.wistia.com/medias/st5gg7rp15 course_id = 44 button_text = 'Code herunterladen']

Hast du eine Frage an uns? Bitte erwähnen Sie es in den Kommentaren und wir werden uns bei Ihnen melden.

Zusammenhängende Posts: