Anàlisi del fitxer XML mitjançant l'analitzador SAX



Java proporciona moltes maneres d'analitzar un fitxer XML com analitzar un fitxer XML mitjançant l'analitzador DOM, l'analitzador SAX o l'analitzador StAX.

Java proporciona moltes maneres d'analitzar un fitxer XML. Per exemple, analitzar un fitxer XML mitjançant analitzador DOM, analitzador SAX o analitzador StAX. En aquest post veurem com analitzar un fitxer XML mitjançant l’analitzador SAX





Abans d’examinar els detalls sobre com analitzar fitxers XML mitjançant l’analitzador SAX, primer veiem quina és la diferència entre analitzar mitjançant diferents analitzadors i quan triar-ne un sobre l’altre.

Analitzador SAX - SAX és un acrònim de Simple API for XML. L'analitzador SAX analitza el fitxer XML línia per línia i desencadena esdeveniments quan es troba amb una etiqueta d'obertura, una etiqueta de tancament o dades de caràcters en un fitxer XML. És per això que l’analitzador SAX s’anomena analitzador basat en esdeveniments



Analitzador DOM - DOM és un acrònim de Document Object Model. A diferència de l’analitzador SAX, l’analitzador DOM carrega el fitxer XML complet a la memòria i crea una estructura d’arbre on cada node de l’arbre representa un component del fitxer XML. Amb l’analitzador DOM podeu crear nodes, eliminar nodes, canviar-ne el contingut i recórrer la jerarquia dels nodes. DOM proporciona la màxima flexibilitat mentre es treballa amb fitxers XML, però inclou un cost de petjada de memòria potencialment gran i requisits significatius de processador en cas de fitxers XML grans.

Analitzador StAX - StAX és un acrònim de Streaming API for XML. Els analitzadors basats en flux són molt útils quan la vostra aplicació té limitacions de memòria. Per exemple, un mòbil amb Java Micro Edition. De la mateixa manera, si la vostra aplicació necessita processar diverses sol·licituds simultàniament, per exemple un servidor d'aplicacions, s'hauria d'utilitzar l'analitzador StAX.

L'anàlisi basat en fluxos es pot classificar a més com:

Pull Parsing - A l’anàlisi pull, l’aplicació client demana mètodes en una biblioteca d’anàlisi XML quan necessita interactuar amb un conjunt de dades XML. En altres paraules, el client només obté dades XML quan ho demana explícitament.



Anàlisi push - En l’anàlisi push, és l’analitzador XML el que envia les dades XML al client quan troba elements d’un conjunt de dades XML. En altres paraules, l'analitzador envia les dades a l'aplicació, independentment que l'aplicació estigui preparada per utilitzar-les o no.

Comparació entre l'analitzador SAX, DOM i StAX:

La taula següent resumeix les característiques de l’analitzador SAX, DOM i StAX

java convertint binari en decimal

Java_bloge_2

Ara que coneixem els diferents analitzadors, vegem com analitzar el fitxer XML mitjançant l’analitzador SAX

Fitxer XML
A continuació es mostra el fitxer XML que analitzarem i construirem objectes Java

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

Estructura del projecte
Aquí teniu la captura de pantalla de l'estructura del projecte a Eclipse IDE

Aquí teniu la classe de DVD que conté una llista d’objectes de pel·lícules

package co.edureka.parsers.sax import java.util.List DVD de classe pública {nom de cadena privada Llista de pel·lícules pública Cadena pública getName () {nom de retorn} public void setName (nom de cadena) {this.name = name} public () {return movies} public void setMovies (Llista de pel·lícules) {this.movies = movies}}

L'objecte de la pel·lícula té propietats com el nom, els directors, el temps d'execució (durada) de la pel·lícula, l'any publicat i el repartiment de la pel·lícula

llista enllaçada al tutorial c
package co.edureka.parsers.sax public class Movie {private String name private String directors private int runtime private int publicat privat String cast public String getName () {return name} public void setName (String name) {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 () { torna 'Pel·lícula [nom =' + nom + ', directors =' + directors + ', temps d'execució =' + temps d'execució + ', llançat =' + llançat + ', cast =' + repartiment + ']'}}

Implementació del SAX Handler:

Estendrem els org.xml.sax.helpers. Classe DefaultHandler que proporciona molts mètodes de devolució de trucada i substituirà els mètodes següents:

startElement () - Aquest mètode es crida quan es troba l'inici d'una etiqueta

endElement () - Aquest mètode es crida quan es troba el final d'una etiqueta

personatges() - Aquest mètode es crida quan es troben algunes dades de text

Nota: Hi ha molts altres mètodes de devolució de trucada, com ara startDocument (), endDocument (), etc. que es poden anul·lar si cal.

package co.edureka.parsers.sax import java.util.ArrayList import java.util.List import org.xml.sax.Attributes import org.xml.sax.helpers.DefaultHandler public class SAXHandler extends DefaultHandler {DVD dvd = new DVD ( ) ListmovieList = new ArrayList () Movie movie = null String content = null public void startElement (String namespaceURI, String localName, String qname, atributs Attributes) {if (qname.equals ('dvd')) {String dvdName = functions.getValue ('nom') 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 (contingut) break case 'directors': movie.setDirectors (content) break case 'released': movie.setReleased (Integer.parseInt (contingut)) break case 'runtime': movie.setRuntime (Integer.parseInt (content)) break case 'cast': movie.setCast (content) break case 'dvd': dvd.setMovies (movieList) break}} public void chara cters (char [] ch, int start, int length) {content = new String (ch, start, length)} DVD públic getDVD () {return dvd}}

Prova del controlador SAX
Ara anem a provar el nostre SAXHandler. A continuació es mostra la classe de prova SAXTest, on primer obtenim una instància de SAXParser de SAXParserFactory i cridem el mètode parse que adopta dos arguments: un fitxer i una instància de controlador.

package 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) llança ParserConfigurationException, SAXException, IOException {SAXParserFactory parserFactor = SAXParserFactor = SAXParserFactory parserFactor.newSAXParser () SAXHandler handler = new SAXHandler () Path path = Paths.get ('src / resources', 'movies.xml') parser.parse (path.toFile (), handler) DVD dvd = handler.getDVD ( ) Llista de pel·lícules = dvd.getMovies () System.out.println ('Nom del DVD:' + dvd.getName ()) per a (Pel·lícula de pel·lícula: pel·lícules) {System.out.println (pel·lícula)}}}

En executar la classe SAXTest obtindreu la sortida següent:

Nota : Si intenteu analitzar un fitxer XML amb estructures diferents de movies.xml, cal canviar el codi dels mètodes startElement () i endElement ().

Si esteu interessats a provar el codi, descarregueu-lo
[buttonleads form_title = ”Codi de descàrrega” redirect_url = https: //edureka.wistia.com/medias/st5gg7rp15 course_id = 44 button_text = ”Codi de descàrrega”]

Tens alguna pregunta? Esmenta’l a la secció de comentaris i et respondrem.

Articles Relacionats:

java convertint binari en decimal