Разбор XML-файла с помощью SAX Parser



Java предоставляет множество способов синтаксического анализа XML-файла, таких как синтаксический анализ XML-файла с использованием парсера DOM, парсера SAX или парсера StAX.

Java предоставляет множество способов синтаксического анализа XML-файла. Например, разбор XML-файла с помощью парсера DOM, парсера SAX или парсера StAX. В этом посте мы увидим, как разобрать XML-файл с помощью парсера SAX.





Прежде чем вдаваться в подробности о том, как анализировать файлы XML с помощью синтаксического анализатора SAX, давайте сначала посмотрим, в чем разница между синтаксическим анализом с помощью разных синтаксических анализаторов и когда следует выбирать один из них.

SAX-парсер - SAX - это аббревиатура от Simple API for XML. SAX Parser анализирует XML-файл построчно и запускает события, когда встречает открывающий тег, закрывающий тег или символьные данные в XML-файле. Вот почему парсер SAX называется анализатором на основе событий.



Парсер DOM - DOM - это аббревиатура от Document Object Model. В отличие от анализатора SAX, анализатор DOM загружает полный XML-файл в память и создает древовидную структуру, в которой каждый узел в дереве представляет собой компонент XML-файла. С помощью парсера DOM вы можете создавать узлы, удалять узлы, изменять их содержимое и перемещаться по иерархии узлов. DOM обеспечивает максимальную гибкость при работе с XML-файлами, но требует потенциально большого объема памяти и значительных требований к процессору в случае больших XML-файлов.

Парсер StAX - StAX - это аббревиатура от Streaming API for XML. Парсеры на основе потоков очень полезны, когда ваше приложение имеет ограничения памяти. Например, мобильный телефон под управлением Java Micro Edition. Точно так же, если ваше приложение должно обрабатывать несколько запросов одновременно, например сервер приложений, следует использовать парсер StAX.

Парсинг на основе потоков можно далее классифицировать как:

Разбор по запросу - При синтаксическом анализе по запросу клиентское приложение вызывает методы библиотеки синтаксического анализа XML, когда ему необходимо взаимодействовать с информационным набором XML. Другими словами, клиент получает данные XML только тогда, когда он явно запрашивает их.



Разбор push - При push-синтаксическом анализе именно XML-анализатор передает XML-данные клиенту, когда он встречает элементы в информационном наборе XML. Другими словами, парсер отправляет данные приложению независимо от того, готово приложение к их использованию или нет.

Сравнение парсера SAX, DOM и StAX:

В таблице ниже суммированы возможности парсера SAX, DOM и StAX.

Java_bloge_2

Теперь, когда мы знаем о различных парсерах, давайте посмотрим, как анализировать XML-файл с помощью парсера SAX.

XML файл
Ниже приведен XML-файл, который мы собираемся анализировать и создавать объекты Java.

Идентичность Борна Дуг Лиман 119 Мэтт Дэймон, Франка Потенте 2002 Превосходство Борна Пол Гринграсс 108 Мэтт Дэймон, Франка Потенте, Джоан Аллен 2004 Ультиматум Борна Пол Гринграсс 115 Мэтт Дэймон, Эдгар Рамирес, Джоан Аллен 2007 Наследие Борна Тони Реннерой 135 Джереми , Рэйчел Вайс, Эдвард Нортон 2012

Структура проекта
Вот скриншот структуры проекта в Eclipse IDE.

Вот класс DVD, который содержит список объектов фильма

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 () {вернуть фильмы} public void setMovies (список фильмов) {this.movies = movies}}

Объект фильма имеет такие свойства, как имя, режиссеры, время выполнения (продолжительность) фильма, год выпуска и состав актеров фильма.

package co.edureka.parsers.sax public class Movie {private String name private String directors private int runtime private int Release private 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 Release} 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 + ']'}}

Реализация обработчика SAX:

Мы собираемся расширить org.xml.sax.helpers. DefaultHandler, который предоставляет множество методов обратного вызова и переопределяет следующие методы:

startElement () - Этот метод вызывается при обнаружении начала тега

endElement () - Этот метод вызывается, когда встречается конец тега

символы() - Этот метод вызывается при обнаружении некоторых текстовых данных

Примечание. Существует множество других методов обратного вызова, таких как startDocument (), endDocument () и т. Д., Которые при необходимости можно переопределить.

package co.edureka.parsers.sax import java.util.ArrayList import java.util.List import org.xml.sax.Attributes import org.xml.sax.helpers.DefaultHandler открытый класс SAXHandler расширяет DefaultHandler {DVD dvd = новый 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 ) {case 'movie': movieList.add (movie) break case 'name': movie.setName (content) break case 'directors': movie.setDirectors (content) break case 'Release': movie.setReleased (Integer.parseInt (content)) break case 'runtime': movie.setRuntime (Integer.parseInt (content)) break case 'cast': movie.setCast (content) break case 'dvd': dvd.setMovies (movieList) break}} public void чара cters (char [] ch, int start, int length) {content = new String (ch, start, length)} общедоступный DVD getDVD () {return dvd}}

Тестирование обработчика SAX
Теперь давайте протестируем наш SAXHandler. Ниже представлен тестовый класс SAXTest, в котором мы сначала получаем экземпляр SAXParser из SAXParserFactory и вызываем метод синтаксического анализа, который принимает два аргумента: файл и экземпляр обработчика.

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 открытый класс SAXTest {public static void main (String [] args) выбрасывает исключение ParserConfigurationException, SAXException, IOException {SAXParserFactory parserFactor = SAXParserFactory (SAXParserFactory) parserFactor.newSAXParser () Обработчик SAXHandler = new SAXHandler () Путь к пути = Paths.get ('src / resources', 'movies.xml') parser.parse (path.toFile (), обработчик) DVD dvd = handler.getDVD ( ) Список фильмов = dvd.getMovies () System.out.println ('Имя DVD:' + dvd.getName ()) для (Фильм фильм: фильмы) {System.out.println (фильм)}}}

При выполнении класса SAXTest вы получите следующий результат:

Заметка : Если вы пытаетесь проанализировать XML-файл с структурами, отличными от movies.xml, то код в методах startElement () и endElement () необходимо изменить.

Если вы хотите попробовать код самостоятельно, скачайте код
[buttonleads form_title = ”Код загрузки” redirect_url = https: //edureka.wistia.com/medias/st5gg7rp15 course_id = 44 button_text = ”Код загрузки”]

Есть вопрос к нам? Пожалуйста, укажите это в комментариях, и мы свяжемся с вами.

как создать массив объектов в Java

Похожие сообщения: