DefaultHandler в парсере SAX в Java

Опубликовано: 10 Января, 2023

SAX — это не что иное, как простой API для XML и основанный на событиях синтаксический анализатор XML-документов. Он отличается от синтаксического анализатора DOM тем, что синтаксический анализатор SAX не создает дерево синтаксического анализа. Процесс выполняется в последовательном порядке, начиная с верхней части документа и заканчивая закрытием КОРНЕВОГО элемента. Своевременные уведомления также отправляются во время парсинга. Токены также следовали в том же порядке. Обработчик события должен быть зарегистрирован в синтаксическом анализаторе. Синтаксический анализатор SAX лучше всего подходит для линейного взгляда на документ, и если он не глубоко вложен, это хорошо. В основном для больших XML-документов SAX лучше, чем DOM, он занимает много памяти при обработке. Это последовательный подход сверху вниз, и, следовательно, произвольный доступ не допускается. Кроме того, если нам нужно выполнять операции по частям, код должен быть написан сам по себе и обработан.

Класс org.xml.sax.helpers.DefaultHandler является базовым классом для «слушателей» в SAX 2.0. Любой класс пользовательского обработчика должен расширять DefaultHandler и переопределять методы, а именно startElement, endElement, символы и т. д. Давайте посмотрим на функциональные возможности каждого метода DefaultHandler.

Методы

Описание

недействительный startDocument () Это вызывается в начале документа.
недействительный конецДокумента() Это вызывается в конце документа
void startElement (String uri, String localName, String qName, Attributes atts) Это вызывается в начале элемента. При разных входных параметрах атрибуты отображаются корректно
void endElement (String uri, String localName, String qName) Это вызывается в конце элемента. При разных входных параметрах атрибуты отображаются корректно
пустые символы (char[] ch, int start, int length) Это вызывается, когда встречаются символьные данные.
void ignorableWhitespace (char[] ch, int start, int length) Это вызывается, когда присутствует DTD и встречаются пробелы, которые нельзя игнорировать.
void processingInstruction (цель String, данные String) Это вызывается, когда инструкция обработки распознана.
void setDocumentLocator (локатор локатора)) Это обеспечивает локатор, и его можно использовать для определения точных позиций в документе.
void skippedEntity (имя строки) Это вызывается, когда присутствует неразрешенный объект.
void startPrefixMapping (префикс строки, String uri) Это вызывается, когда определяется новое сопоставление пространства имен.
void endPrefixMapping (префикс строки) Это вызывается, когда определение пространства имен завершает свою область действия.

Пример

Давайте посмотрим на пример программы, использующей метод SAX Parser с использованием DefaultHandler. Мы создаем класс с именем «EmployeeHandler», который расширяет «DefaultHandler», и поэтому нам нужно переопределить методы, а именно startElement, endElement, символы и т. д.

Наш входной файл: employee.txt

XML




<?xml version = "1.0"?>
<class>
   <employee id = "300">
      <firstname>Geek</firstname>
      <lastname>Person1</lastname>
      <nickname>Rachel</nickname>
      <salary>85000</salary>
   </employee>
     
   <employee id = "400">
      <firstname>Geek</firstname>
      <lastname>Person2</lastname>
      <nickname>Monica</nickname>
      <salary>75000</salary>
   </employee>
     
   <employee id = "500">
      <firstname>Geek</firstname>
      <lastname>Person3</lastname>
      <nickname>Phoebe</nickname>
      <salary>70000</salary>
   </employee>
</class>

СотрудникSAXParserDemo.java

Java




import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
  
public class EmployeeSAXParserDemo {
    public static void main(String[] args) {
      try {
         File inputFile = new File("employee.txt");
         SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
         SAXParser saxParser = saxParserFactory.newSAXParser();
         EmployeeHandler employeeHandler = new EmployeeHandler();
         saxParser.parse(inputFile, employeeHandler);     
      } catch (Exception e) {
         e.printStackTrace();
      }
   }     
}
  
class EmployeeHandler extends DefaultHandler {
   boolean isFirstName = false;
   boolean isLastName = false;
   boolean isNickName = false;
   boolean isSalary = false;
  
   @Override
   public void startElement(
      String uri, String localName, String attributeName, Attributes attributes)
      throws SAXException {
        
      if (attributeName.equalsIgnoreCase("employee")) {
         String id = attributes.getValue("id");
         System.out.println("Employee ID : " + id);
      } else if (attributeName.equalsIgnoreCase("firstname")) {
         isFirstName = true;
      } else if (attributeName.equalsIgnoreCase("lastname")) {
         isLastName = true;
      } else if (attributeName.equalsIgnoreCase("nickname")) {
         isNickName = true;
      }
      else if (attributeName.equalsIgnoreCase("salary")) {
         isSalary = true;
      }
   }
  
   @Override
   public void endElement(String uri, 
      String localName, String attributeName) throws SAXException {
      if (attributeName.equalsIgnoreCase("employee")) {
         System.out.println("End Element :" + attributeName);
      }
   }
  
   @Override
   public void characters(char character[], int start, int length) throws SAXException {
      if (isFirstName) {
         System.out.println("First Name: " + new String(character, start, length));
         isFirstName = false;
      } else if (isLastName) {
         System.out.println("Last Name: " + new String(character, start, length));
         isLastName = false;
      } else if (isNickName) {
         System.out.println("Nick Name: " + new String(character, start, length));
         isNickName = false;
      } else if (isSalary) {
         System.out.println("Salary: " + new String(character, start, length));
         isSalary = false;
      }
   }
}

Выход:

При запуске приведенного выше кода вывод выглядит следующим образом

Примечание:

Для обработки исключений необходимо переопределить 3 метода в EmployeeHandler, если это необходимо.

public void warning(SAXParseException e) throws SAXException {
}
public void error(SAXParseException e) throws SAXException {
}
public void fatalError(SAXParseException e) throws SAXException {
}

Вывод

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