Автор оригинала: Pankaj Kumar.
Синтаксический анализатор SAX на java предоставляет API для анализа XML-документов. Синтаксический анализатор SAX отличается от синтаксического анализатора DOM тем, что он не загружает полный XML-файл в память и не читает xml-документ последовательно.
Синтаксический анализатор саксофона
javax.xml.parsers.SAXParser
предоставляет метод для анализа XML-документа с использованием обработчиков событий. Этот класс реализует интерфейс XmlReader
и предоставляет перегруженные версии методов parse()
для чтения XML-документа из файла, входного потока, входного источника SAX и строкового URI.
Фактический синтаксический анализ выполняется классом обработчика. Нам нужно создать свой собственный класс обработчика для анализа XML-документа. Нам нужно реализовать org.xml.sax.ContentHandler
интерфейс для создания собственных классов обработчиков. Этот интерфейс содержит методы обратного вызова, которые получают уведомление при возникновении события. Например, startDocument, endDocument, startElement, endElement, Символьные данные и т.д.
org.xml.sax.помощники.DefaultHandler
предоставляет реализацию интерфейса ContentHandler по умолчанию, и мы можем расширить этот класс, чтобы создать наш собственный обработчик. Рекомендуется расширить этот класс, потому что для реализации нам может потребоваться всего несколько методов. Расширение этого класса сделает наш код более чистым и доступным для обслуживания.
Пример синтаксического анализатора SAX
Давайте перейдем к примеру программы SAX parser прямо сейчас, позже я подробно объясню различные функции.
Давайте перейдем к примеру программы SAX parser прямо сейчас, позже я подробно объясню различные функции.
29 Pankaj Male Java Developer 35 Lisa Female CEO 40 Tom Male Manager 25 Meghna Female Manager
Итак, у нас есть XML-файл, хранящийся где-то в файловой системе, и, посмотрев на него, мы можем сделать вывод, что он содержит список сотрудников. У каждого сотрудника есть идентификатор
атрибут и поля возраст
, имя
, пол
и роль
.
Мы будем использовать синтаксический анализатор SAX для анализа этого XML и создания списка объектов сотрудников.
Вот объект Employee, представляющий элемент Employee из XML.
package com.journaldev.xml; public class Employee { private int id; private String name; private String gender; private int age; private String role; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getRole() { return role; } public void setRole(String role) { this.role = role; } @Override public String toString() { return "Employee:: ID="+this.id+" Name=" + this.name + " Age=" + this.age + " Gender=" + this.gender + " Role=" + this.role; } }
Давайте создадим наш собственный класс обработчика синтаксического анализатора SAX, расширяющий DefaultHandler класс.
package com.journaldev.xml.sax; import java.util.ArrayList; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import com.journaldev.xml.Employee; public class MyHandler extends DefaultHandler { // List to hold Employees object private ListempList = null; private Employee emp = null; private StringBuilder data = null; // getter method for employee list public List getEmpList() { return empList; } boolean bAge = false; boolean bName = false; boolean bGender = false; boolean bRole = false; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (qName.equalsIgnoreCase("Employee")) { // create a new Employee and put it in Map String id = attributes.getValue("id"); // initialize Employee object and set id attribute emp = new Employee(); emp.setId(Integer.parseInt(id)); // initialize list if (empList == null) empList = new ArrayList<>(); } else if (qName.equalsIgnoreCase("name")) { // set boolean values for fields, will be used in setting Employee variables bName = true; } else if (qName.equalsIgnoreCase("age")) { bAge = true; } else if (qName.equalsIgnoreCase("gender")) { bGender = true; } else if (qName.equalsIgnoreCase("role")) { bRole = true; } // create the data container data = new StringBuilder(); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if (bAge) { // age element, set Employee age emp.setAge(Integer.parseInt(data.toString())); bAge = false; } else if (bName) { emp.setName(data.toString()); bName = false; } else if (bRole) { emp.setRole(data.toString()); bRole = false; } else if (bGender) { emp.setGender(data.toString()); bGender = false; } if (qName.equalsIgnoreCase("Employee")) { // add Employee object to list empList.add(emp); } } @Override public void characters(char ch[], int start, int length) throws SAXException { data.append(new String(ch, start, length)); } }
Мой обработчик содержит список объекта Employee
в виде поля только с помощью метода getter. Объекты Сотрудник
добавляются в методы обработчика событий. Кроме того, у нас есть поле Сотрудник, которое будет использоваться для создания объекта Сотрудник, и как только все поля будут заданы, добавьте его в список сотрудников.
Методы синтаксического анализа SAX для переопределения
Важными методами для переопределения являются startElement()
, endElement()
и символы()
.
Синтаксический анализатор SAX
начинает разбор документа, когда найден любой начальный элемент, вызывается метод startElement ()
. Мы переопределяем этот метод, чтобы задать логические переменные, которые будут использоваться для идентификации элемента.
Мы также используем этот метод для создания нового объекта Employee при каждом обнаружении элемента Employee start. Проверьте, как здесь читается атрибут id, чтобы задать поле Объект сотрудника идентификатор
.
метод characters()
вызывается, когда сакспарсер находит символьные данные внутри элемента. Обратите внимание, что синтаксический анализатор SAX может разделить данные на несколько блоков и вызвать символы()
метод несколько раз (прочитайте документацию по методу символов класса ContentHandler ()). Вот почему мы используем StringBuilder для хранения этих данных с помощью метода append ().
endElement ()
– это место, где мы используем данные StringBuilder для задания свойств объекта сотрудника и добавления объекта сотрудника в список всякий раз, когда мы находим тег конечного элемента сотрудника.
Ниже приведена тестовая программа, которая использует Мой обработчик
для анализа приведенного выше XML-кода в список объектов сотрудников.
package com.journaldev.xml.sax; import java.io.File; import java.io.IOException; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; import com.journaldev.xml.Employee; public class XMLParserSAX { public static void main(String[] args) { SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); try { SAXParser saxParser = saxParserFactory.newSAXParser(); MyHandler handler = new MyHandler(); saxParser.parse(new File("/Users/pankaj/employees.xml"), handler); //Get Employees list ListempList = handler.getEmpList(); //print employee information for(Employee emp : empList) System.out.println(emp); } catch (ParserConfigurationException | SAXException | IOException e) { e.printStackTrace(); } } }
Вот результат работы вышеприведенной программы.
Employee:: ID=1 Name=Pankaj Age=29 Gender=Male Role=Java Developer Employee:: ID=2 Name=Lisa Age=35 Gender=Female Role=CEO Employee:: ID=3 Name=Tom Age=40 Gender=Male Role=Manager Employee:: ID=4 Name=Meghna Age=25 Gender=Female Role=Manager
SAXParserFactory
предоставляет заводские методы для получения экземпляра SAXParser
. Мы передаем файловый объект методу синтаксического анализа вместе с экземпляром моего обработчика для обработки событий обратного вызова.
Синтаксический анализатор SAX вначале немного сбивает с толку, но если вы работаете с большим XML-документом, он обеспечивает более эффективный способ чтения XML, чем синтаксический анализатор DOM. Это все для синтаксического анализатора SAX на Java.
Ссылка : Синтаксический анализатор SAX , Обработчик по умолчанию