Analisando arquivo XML usando SAX Parser



Java fornece várias maneiras de analisar um arquivo XML, como analisar um arquivo XML usando analisador DOM, analisador SAX ou analisador StAX.

Java fornece várias maneiras de analisar um arquivo XML. Por exemplo, analisar um arquivo XML usando analisador DOM, analisador SAX ou analisador StAX. Neste post, veremos como analisar um arquivo XML usando o analisador SAX





Antes de entrar em detalhes sobre como analisar arquivos XML usando o analisador SAX, vamos primeiro ver qual é a diferença entre analisar por meio de analisadores diferentes e quando escolher um ou outro.

SAX Parser - SAX é um acrônimo para Simple API for XML. SAX Parser analisa o arquivo XML linha por linha e dispara eventos quando encontra a marca de abertura, marca de fechamento ou dados de caractere no arquivo XML. É por isso que o analisador SAX é chamado de analisador baseado em evento



Analisador DOM - DOM é um acrônimo para Document Object Model. Ao contrário do analisador SAX, o analisador DOM carrega o arquivo XML completo na memória e cria uma estrutura em árvore onde cada nó da árvore representa um componente do arquivo XML. Com o analisador DOM, você pode criar nós, remover nós, alterar seu conteúdo e percorrer a hierarquia de nós. DOM fornece flexibilidade máxima ao trabalhar com arquivos XML, mas vem com um custo de pegada de memória potencialmente grande e requisitos de processador significativos no caso de arquivos XML grandes

StAX Parser - StAX é um acrônimo para Streaming API for XML. Os analisadores baseados em fluxo são muito úteis quando seu aplicativo tem limitações de memória. Por exemplo, um telefone celular executando o Java Micro Edition. Da mesma forma, se seu aplicativo precisar processar várias solicitações simultaneamente, por exemplo, um servidor de aplicativos, o analisador StAX deve ser usado.

A análise baseada em fluxo pode ainda ser classificada como:

Pull Parsing - Na análise pull, o aplicativo cliente chama métodos em uma biblioteca de análise XML quando precisa interagir com um infoset XML. Em outras palavras, o cliente só obtém dados XML quando os solicita explicitamente.



Análise push - Na análise push, é o analisador XML que envia os dados XML para o cliente, quando ele encontra elementos em um infoset XML. Em outras palavras, o analisador envia os dados para o aplicativo independentemente de o aplicativo estar pronto para usá-lo ou não.

o que o bufferedreader faz em java

Comparação entre SAX, DOM e analisador StAX:

A tabela abaixo resume os recursos do analisador SAX, DOM e StAX

Java_bloge_2

Agora que sabemos sobre os diferentes analisadores, vamos ver como analisar o arquivo XML usando o analisador SAX

Arquivo XML
Abaixo está o arquivo XML que iremos analisar e construir objetos Java

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

Estrutura do Projeto
Aqui está a captura de tela da estrutura do projeto no Eclipse IDE

Aqui está a classe DVD que contém uma lista de objetos de filme

package co.edureka.parsers.sax import java.util.List public class DVD {private String name private List movies public String getName () {return name} public void setName (String name) {this.name = name} public List getMovies () {retornar filmes} public void setMovies (Listar filmes) {this.movies = movies}}

O objeto de filme tem propriedades como nome, diretores, tempo de execução (duração) do filme, ano de lançamento e elenco do filme

pacote co.edureka.parsers.sax public class Filme {private String name private String diretores private int runtime private int liberado private String cast public String getName () {return name} public void setName (String name) {this.name = name} public String getDirectors () {retornar diretores} public void setDirectors (String diretores) {this.directors = diretores} public int getRuntime () {return runtime} public void setRuntime (int runtime) {this.runtime = runtime} public int getReleased ( ) {retorno lançado} public void setReleased (int lançado) {this.released = release} public String getCast () {return cast} public void setCast (String cast) {this.cast = cast} @Override public String toString () { retornar 'Filme [nome =' + nome + ', diretores =' + diretores + ', tempo de execução =' + tempo de execução + ', lançado =' + lançado + ', elenco =' + elenco + ']'}}

Implementando o SAX Handler:

Vamos estender o org.xml.sax.helpers. Classe DefaultHandler que fornece muitos métodos de retorno de chamada e substituirá os seguintes métodos:

startElement () - Este método é chamado quando o início de uma tag é encontrado

endElement () - Este método é chamado quando o fim de uma tag é encontrado

o que é scipy em python

personagens() - Este método é chamado quando algum dado de texto é encontrado

Nota: Existem muitos outros métodos de retorno de chamada, como startDocument (), endDocument () etc., que podem ser substituídos se necessário.

pacote 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 estende DefaultHandler {DVD dvd = new DVD ( ) ListmovieList = new ArrayList () Filme filme = null String content = null public void startElement (String namespaceURI, String localName, String qname, Atributos de atributos) {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 'diretores': movie.setDirectors (content) break case 'liberado': movie.setReleased (Integer.parseInt (conteúdo)) 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)} public DVD getDVD () {return dvd}}

Testando o SAX Handler
Agora vamos testar nosso SAXHandler. Abaixo está a classe de teste SAXTest onde primeiro obtemos uma instância de SAXParser de SAXParserFactory e chamamos o método de análise que leva dois argumentos: Um arquivo e uma instância de manipulador.

pacote 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) aciona ParserConfigurationException, SAXException, IOException {SAXParserFactory.newFactor = parserFactory de parser (SAXParserFactory) parserFactor.newSAXParser () SAXHandler handler = new SAXHandler () Path path = Paths.get ('src / resources', 'movies.xml') parser.parse (path.toFile (), handler) DVD dvd = handler.getDVD ( ) Listar filmes = dvd.getMovies () System.out.println ('Nome do DVD:' + dvd.getName ()) para (Filme de filme: filmes) {System.out.println (filme)}}}

Ao executar a classe SAXTest, você obterá a seguinte saída:

Nota : Se você estiver tentando analisar um arquivo XML com estruturas diferentes de movies.xml, o código nos métodos startElement () e endElement () precisa ser alterado.

Se você estiver interessado em experimentar o código, faça o download do código
[buttonleads form_title = ”Código de download” redirect_url = https: //edureka.wistia.com/medias/st5gg7rp15 course_id = 44 button_text = ”Código de download”]

Tem alguma questão para nós? Mencione isso na seção de comentários e entraremos em contato com você.

Postagens relacionadas: