Рубрики
Без рубрики

Пример синтаксического анализатора SAX. Пример учебника по синтаксическому анализу Java SAX. SAXParser, XmlReader, SAXParserFactory, обработчик содержимого, обработчик по умолчанию, начальный элемент, конечный элемент.

Пример синтаксического анализатора SAX. Пример учебника по синтаксическому анализу Java SAX. SAXParser, XmlReader, SAXParserFactory, обработчик содержимого, обработчик по умолчанию, начальный элемент, конечный элемент.

Автор оригинала: 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 List empList = 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
        List empList = 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 , Обработчик по умолчанию