Java | InputOutputOperations
September 18, 2023

SAX and DOM parsing in Java

Для начала разберемся, что такое XML файл и для чего он нужен.

Для Java-приложений XML-файлы могут также служить в качестве конфигурационных файлов (например, для сохранения параметров приложения, конфигурации сервисов и других настроек).

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

XML(eXtensible Markup Language) - расширяемый язык разметки документов. В отличие от HTML, который направлен на визуальное представление документа в браузере, XML используется для обмена данными между компьютером и приложением.

Внутри, файл выглядит, как набор тегов с информацией(открывающие и закрывающие) в виде древовидной структуры.
Рассмотрим пример ниже. В каждом файле существует корневой тег - в нашем случае <voters> (он может иметь любое имя, в зависимости от выполняемой задачи). Далее, идут ветви, их может быть несколько, в нашем случае они одного типа с тегом voter и visit. И внутри мы имеем атрибуты {name, birthDay, station, time} с их значениями.

<?xml version="1.0" encoding="UTF-8"?>
<voters>
<voter name="Тиронов Мартьян" birthDay="1932.11.08">   
<visit station="120" time="2015.09.17 15:51:40" />
</voter>
<voter name="Варик Макар" birthDay="1924.12.31">   
<visit station="48" time="2015.09.21 22:24:28" />
</voter>
<voter name="Погребной Миронег" birthDay="1948.05.23">   
<visit station="170" time="2015.09.19 14:59:01" />
</voter>
...
...
</voters>


Далее, на основе XML нам нужно создать объектную модель. Для этого создается пакет model и в нем создается класс, с таким именем, как и в XML файле.
Класс создается для добавления и дальнейшей работы с элементами, которые находятся в XML файле.

Существуют несколько стратегий обработки XML документов. Мы
рассмотрим - DOM (Document Object Model) и SAX (Simple API for XML). Основное их отличие связано с тем, что использование DOM позволяет читать и вносить изменения в существующий XML-документ, а также создавать новый. Стратегия использования SAX основывается на том, что содержимое XML-документа только анализируется. XML-текст может быть больших размеров: DOM должен весь документ «заглотить» и проанализировать, а SAX-парсер обрабатывает XML-документ последовательно и не требует дополнительной памяти.

DOM API
DOM (Document Object Model) - это стандартный способ представления и взаимодействия с содержимым XML-документов в программах на Java. Предоставляет процесс обработки по факту, загружая файл полностью в память. Хорошо работает с небольшими файлами.

Для парсинга, нам следует открыть файл, используя объекты типа - File, DocumentBuilderFactory, DocumentBuilder, Document.
В DOM есть три важных объекта - Node(каждый элемент(отступы, строки и тд) в XML), NodeList(получаем лист наших Node), Element(конкретный объект, заключаемый в тег).

SAX API
SAX(Simple API for XML) - это API, который используется для чтения и обработки XML-документов в Java. Он очень быстр и мало зависит от объема данных, за счет этого имеет большую популярность.
Чтение XML документа с помощью SAX является событийном процессом, то есть SAX предоставляет набор обработчиков событий, которые вызываются автоматически при обработке каждого элемента документа. Файл в память подгружается частями.

Для парсинга мы используем объекты типа - SAXParserFactory(Определяет API фабрики, который позволяет приложениям сконфигурировать и получить SAX базируемый синтаксический анализатор, чтобы проанализировать XML-документы), SAXParser. И для успешной работы парсера нам необходимо переопределить нужные нам методы класса DefaultHandler.


Полезные ссылки:
https://www.youtube.com/watch?v=wXupOedG6vU
https://www.youtube.com/watch?v=T0nRDi0k4fU
https://java-online.ru/java-xml.xhtml
https://habr.com/ru/articles/62757/
https://mou43-samara.ru/education/kak-prochitat-xml-fajl-v-java-prostye-shagi-i#:~:text=i%20%3C%20attributes.getLength-,%D0%A7%D1%82%D0%BE%20%D1%82%D0%B0%D0%BA%D0%BE%D0%B5%20xml%20%D1%84%D0%B0%D0%B9%D0%BB%20%D0%B8%20%D0%B7%D0%B0%D1%87%D0%B5%D0%BC%20%D0%BE%D0%BD%20%D0%BD%D1%83%D0%B6%D0%B5%D0%BD%20%D0%B2%20Java,%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%B0%D0%BC%D0%B8%20%D0%B8%20%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8.