Przetwarzanie pliku XML przy użyciu parsera SAX



Java udostępnia wiele sposobów analizowania pliku XML, np. Analizowanie pliku XML przy użyciu parsera DOM, parsera SAX lub parsera StAX.

Java udostępnia wiele sposobów analizowania pliku XML. Na przykład parsowanie pliku XML przy użyciu parsera DOM, parsera SAX lub parsera StAX. W tym poście zobaczymy, jak przeanalizować plik XML za pomocą parsera SAX





c ++ sortuje tablicę w porządku rosnącym

Zanim przejdziemy do szczegółów, jak analizować pliki XML przy użyciu parsera SAX, zobaczmy najpierw, jaka jest różnica między analizowaniem różnych parserów i kiedy wybrać jeden z nich.

SAX Parser - SAX to skrót od Simple API for XML. SAX Parser analizuje plik XML wiersz po wierszu i wyzwala zdarzenia, gdy napotka znacznik otwierający, zamykający lub dane znakowe w pliku XML. Dlatego parser SAX nazywany jest parserem opartym na zdarzeniach



Parser DOM - DOM to akronim od Document Object Model. W przeciwieństwie do parsera SAX parser DOM ładuje cały plik XML do pamięci i tworzy strukturę drzewiastą, w której każdy węzeł w drzewie reprezentuje składnik pliku XML. Za pomocą parsera DOM możesz tworzyć węzły, usuwać węzły, zmieniać ich zawartość i przechodzić przez hierarchię węzłów. DOM zapewnia maksymalną elastyczność podczas pracy z plikami XML, ale wiąże się z kosztem potencjalnie dużego zużycia pamięci i znacznych wymagań procesora w przypadku dużych plików XML

StAX Parser - StAX to akronim od Streaming API for XML. Parsery oparte na strumieniu są bardzo przydatne, gdy aplikacja ma ograniczenia pamięci. Na przykład telefon komórkowy z oprogramowaniem Java Micro Edition. Podobnie, jeśli Twoja aplikacja musi przetwarzać kilka żądań jednocześnie, na przykład serwer aplikacji, należy użyć parsera StAX.

Analiza strumieniowa może być dalej sklasyfikowana jako:

Pull Parsing - Podczas analizowania typu pull, aplikacja kliencka wywołuje metody z biblioteki analizującej XML, gdy musi współdziałać z zestawem informacji XML. Innymi słowy, klient pobiera dane XML tylko wtedy, gdy wyraźnie o to prosi.



Push Parsing - W parsowaniu wypychanym to parser XML wypycha dane XML do klienta, gdy napotka elementy w zestawie informacji XML. Innymi słowy, parser wysyła dane do aplikacji niezależnie od tego, czy aplikacja jest gotowa do użycia, czy nie.

Porównanie parsera SAX, DOM i StAX:

Poniższa tabela zawiera podsumowanie funkcji parsera SAX, DOM i StAX

Java_bloge_2

Teraz, gdy wiemy już o różnych parserach, zobaczmy, jak przeanalizować plik XML za pomocą parsera SAX

Plik XML
Poniżej znajduje się plik XML, który będziemy analizować i konstruować obiekty Java

Tożsamość Bourne'a Doug Liman 119 Matt Damon, Franka Potente 2002 Supremacja Bourne'a Paul Greengrass 108 Matt Damon, Franka Potente, Joan Allen 2004 Ultimatum Bourne'a Paul Greengrass 115 Matt Damon, Edgar Ramirez, Joan Allen 2007 Dziedzictwo Bourne'a Tony Gilroy 135 Jeremy Renner , Rachel Weisz, Edward Norton 2012

Struktura projektu
Oto zrzut ekranu struktury projektu w Eclipse IDE

Oto klasa DVD, która zawiera listę obiektów filmowych

pakiet co.edureka.parsers.sax import java.util.List public class DVD {private String name private Lista filmów public String getName () {return name} public void setName (String name) {this.name = name} public Lista getMovies () {powrót filmów} public void setMovies (lista filmów) {this.movies = movies}}

Obiekt filmowy ma takie właściwości, jak nazwa, reżyser, czas działania (czas trwania) filmu, rok wydania i obsada filmu

pakiet co.edureka.parsers.sax klasa publiczna Film {prywatna nazwa ciągu prywatna String reżyserów prywatna int środowisko wykonawcze prywatne int zwolniona prywatna Rzutowanie łańcucha public String getName () {nazwa zwracana} public void setName (nazwa ciągu) {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 ( ) {powrót wydany} public void setReleased (int release) {this.released = release} public String getCast () {return cast} public void setCast (String cast) {this.cast = cast} @Override public String toString () { return 'Movie [name =' + name + ', directors =' + directors + ', runtime =' + runtime + ', release =' + release + ', cast =' + cast + ']'}}

Wdrażanie programu obsługi SAX:

Zamierzamy rozszerzyć plik org.xml.sax.helpers. Klasa DefaultHandler, która udostępnia wiele metod wywołania zwrotnego i przesłania następujące metody:

startElement () - Ta metoda jest wywoływana po napotkaniu początku tagu

endElement () - Ta metoda jest wywoływana po napotkaniu końca tagu

postacie() - Ta metoda jest wywoływana w przypadku napotkania pewnych danych tekstowych

Uwaga: istnieje wiele innych metod wywołania zwrotnego, takich jak startDocument (), endDocument () itp., Które w razie potrzeby można zastąpić.

pakiet co.edureka.parsers.sax import java.util.ArrayList import java.util.List import org.xml.sax.Attributes import org.xml.sax.helpers.DefaultHandler klasa publiczna SAXHandler rozszerza DefaultHandler {DVD dvd = nowe DVD ( ) ListmovieList = new ArrayList () Movie movie = null String content = null public void startElement (String namespaceURI, String localName, String qname, Attributes attributes) {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 ) {sprawa 'movie': movieList.add (movie) break case 'name': movie.setName (content) break case 'directors': movie.setDirectors (content) break case 'release': movie.setReleased (Integer.parseInt (content)) przypadek przerwania 'runtime': movie.setRuntime (Integer.parseInt (content)) przypadek przerwania 'cast': movie.setCast (content) przypadek przerwy '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}}

Testowanie obsługi SAX
Teraz przetestujmy nasz SAXHandler. Poniżej znajduje się klasa testowa SAXTest, w której najpierw pobieramy instancję SAXParser z SAXParserFactory i wywołujemy metodę parsowania, która przyjmuje dwa argumenty: plik i instancję obsługi.

pakiet 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) rzuca ParserConfigurationException, SAXException, IOException {SAXParserFactory parserFactor = SAXParserFactory.newInstars = SAXParserFactory.newInstars parserFactor.newSAXParser () SAXHandler handler = new SAXHandler () Path path = Paths.get ('src / resources', 'movies.xml') parser.parse (path.toFile (), handler) DVD dvd = handler.getDVD ( ) Lista filmów = dvd.getMovies () System.out.println ('Nazwa DVD:' + dvd.getName ()) for (Film: filmy) {System.out.println (film)}}}

Po wykonaniu klasy SAXTest otrzymasz następujące dane wyjściowe:

Uwaga : Jeśli próbujesz przeanalizować plik XML z inną strukturą niż movies.xml, kod w metodach startElement () i endElement () musi zostać zmieniony.

Jeśli chcesz samodzielnie wypróbować kod, pobierz kod
[buttonleads form_title = ”Pobierz kod” redirect_url = https: //edureka.wistia.com/medias/st5gg7rp15 course_id = 44 button_text = ”Pobierz kod”]

Masz do nas pytanie? Wspomnij o tym w sekcji komentarzy, a my skontaktujemy się z Tobą.

Powiązane posty:

aktywne i pasywne przemiany w informatyce