Чтение XML файла средствами SAX XML

В отличие от DOM парсера, SAX парсер не читает весь XML файл, не загружает его полностью в оперативную память и не создает полную объектную модель читаемого XML документа. Вместо этого, SAX парсер информирует клиентский код о структуре читаемого XML документ, вызывая методы класса org.xml.sax.helpers.DefaultHandler.


Важно!

SAX парсер работает намного быстрее и использует гораздо меньше памяти, чем DOM XML парсер.

Для того, чтобы сообщить клиентскому коду структуру и содержание XML документа, SAX парсер использует следующие методы:

  • startDocument() и endDocument() — методы, которые вызываются в начале и конце XML документа соответственно;
  • startElement() и endElement() — методы, которые вызываются в начале и в конце XML элемента, соответственно;
  • characters() — метод, который вызывается для текста, расположенного между открывающим и закрывающим тегами XML элемента.

На самом деле, в классе  определено гораздо больше методов, но в данной статье они не представляют для нас интереса. Для получения информации о них обратитесь к документации.

Мы рассмотрим простой пример использования этих методов для получения структуры XML файла.

XML файл

<?xml version="1.0"?>
<company>
    <staff id="1001">
        <firstname>Иван</firstname>
        <lastname>Иванов</lastname>
        <nickname>ivanov</nickname>
        <salary>100000</salary>
    </staff>
    <staff id="2001">
        <firstname>Петр</firstname>
        <lastname>Петров</lastname>
        <nickname>petrov</nickname>
        <salary>200000</salary>
    </staff>
</company>

Программа

package ru.j4web.examples.java.xml;

import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.ParserConfigurationException;
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 ReadXMLFileSAXExample {

    private static final String FILENAME = "staff.xml";

    public static void main(String[] args) {

        SAXParser saxParser;
        try {
            saxParser = SAXParserFactory.newInstance().newSAXParser();

            DefaultHandler handler = new DefaultHandler() {

                boolean bfname = false;
                boolean blname = false;
                boolean bnname = false;
                boolean bsalary = false;

                @Override
                public void startElement(String uri, String localName,
                        String qName, Attributes attributes)
                        throws SAXException {

                    System.out.println("Начало элемента: " + qName);
                    if (qName.equalsIgnoreCase("FIRSTNAME")) {
                        bfname = true;
                    }
                    if (qName.equalsIgnoreCase("LASTNAME")) {
                        blname = true;
                    }
                    if (qName.equalsIgnoreCase("NICKNAME")) {
                        bnname = true;
                    }
                    if (qName.equalsIgnoreCase("SALARY")) {
                        bsalary = true;
                    }
                }

                @Override
                public void endElement(String uri, String localName,
                        String qName) throws SAXException {
                    System.out.println("Конец элемента: " + qName);
                }

                @Override
                public void characters(char ch[], int start,
                        int length) throws SAXException {
                    if (bfname) {
                        System.out.println("Имя: "
                                + new String(ch, start, length));
                        bfname = false;
                    }
                    if (blname) {
                        System.out.println("Фамилия: "
                                + new String(ch, start, length));
                        blname = false;
                    }
                    if (bnname) {
                        System.out.println("Никнейм: "
                                + new String(ch, start, length));
                        bnname = false;
                    }
                    if (bsalary) {
                        System.out.println("Зарплата: "
                                + new String(ch, start, length));
                        bsalary = false;
                    }

                }
            };

            saxParser.parse(System.getProperty("user.dir") + File.separator
                    + FILENAME, handler);
        } catch (ParserConfigurationException | SAXException
                | IOException ex) {
            Logger.getLogger(ReadXMLFileSAXExample.class.getName())
                    .log(Level.SEVERE, null, ex);
        }
    }
}
Начало элемента: company
Начало элемента: staff
Начало элемента: firstname
Имя: Иван
Конец элемента: firstname
Начало элемента: lastname
Фамилия: Иванов
Конец элемента: lastname
Начало элемента: nickname
Никнейм: ivanov
Конец элемента: nickname
Начало элемента: salary
Зарплата: 100000
Конец элемента: salary
Конец элемента: staff
Начало элемента: staff
Начало элемента: firstname
Имя: Петр
Конец элемента: firstname
Начало элемента: lastname
Фамилия: Петров
Конец элемента: lastname
Начало элемента: nickname
Никнейм: petrov
Конец элемента: nickname
Начало элемента: salary
Зарплата: 200000
Конец элемента: salary
Конец элемента: staff
Конец элемента: company

Полезная информация

Оставить комментарий

Ваш email нигде не будет показанОбязательные для заполнения поля помечены *

*