В Java существует два способа анализа XML-документов, а именно: анализ Dom и анализ Sax.
Функция анализа Dom является мощной, ее можно добавлять, удалять, изменять и проверять. Во время работы XML-документ будет считываться в память в виде объекта документа, поэтому он подходит для небольших документов.
Парсинг Sax читает содержимое построчно и поэлементно от начала до конца. Модифицировать его сложнее, но он подходит для больших документов, доступных только для чтения.
В этой статье в основном объясняется синтаксический анализ Sax, остальное будет описано позже.
Sax использует событийно-ориентированный подход к анализу документов. Проще говоря, это похоже на просмотр фильма в кинотеатре. Вы можете смотреть его от начала до конца, не возвращаясь назад (Дом может читать его взад и вперед).
В процессе просмотра фильма каждый раз, когда вы сталкиваетесь с сюжетом, слезой или встречей плечом к плечу, вы мобилизуете свой мозг и нервы на получение или обработку этой информации.
Аналогично, во время процесса анализа Sax чтение начала и конца документа, а также начала и конца элемента запускает некоторые методы обратного вызова. В этих методах обратного вызова можно выполнить соответствующую обработку событий.
Четыре метода: startDocument(), endDocument(), startElement(), endElement.
Кроме того, недостаточно прочитать узел. Нам также нужен метод символов() , чтобы тщательно обработать содержимое, содержащееся в элементе.
Собирая эти методы обратного вызова, формируется класс, который и является нужным нам триггером.
Обычно документ читается из метода Main, но документ обрабатывается в триггере. Это так называемый метод синтаксического анализа, управляемый событиями.
Как показано выше, в триггере он сначала начинает читать документ, а затем анализировать элементы один за другим. Содержимое каждого элемента будет возвращено методу символов().
Затем завершите чтение элемента. После того, как все элементы были прочитаны, завершите анализ документа.
Теперь мы приступаем к созданию класса триггера. Чтобы создать этот класс, нам сначала нужно наследовать DefaultHandler.
Создайте SaxHandler и переопределите соответствующий метод:
публичный класс SaxHandler расширяет DefaultHandler {
/* Этот метод имеет три параметра
arg0 — возвращаемый массив символов, содержащий содержимое элемента.
arg1 и arg2 — начальная и конечная позиции массива соответственно*/
@Override
общественные недействительные символы (char[] arg0, int arg1, int arg2) выбрасывает SAXException {
Содержимое строки = новая строка (arg0, arg1, arg2);
System.out.println(содержимое);
super.characters(arg0, arg1, arg2);
}
@Override
public void endDocument() выдает SAXException {
System.out.println("/n...Завершить анализ документа...");
супер.конечныйДокумент();
}
/* arg0 — пространство имен
arg1 — это метка, содержащая пространство имен, или пустая, если пространства имен нет.
arg2 — это метка без пространства имен*/
@Override
public void endElement (String arg0, String arg1, String arg2)
выдает SAXException {
System.out.println("Конец элемента синтаксического анализа" + arg2);
super.endElement(arg0, arg1, arg2);
}
@Override
public void startDocument() выдает исключение SAXException {
System.out.println("…………Начать анализ документа………/n");
супер.startDocument();
}
/*arg0 — пространство имен
arg1 — это метка, содержащая пространство имен, или пустая, если пространства имен нет.
arg2 — метка без пространства имен
arg3, очевидно, представляет собой набор атрибутов*/
@Override
public void startElement(String arg0, String arg1, String arg2,
Атрибуты arg3) выбрасывает SAXException {
System.out.println("Начать анализ элементов" + arg2);
если (arg3 != ноль) {
for (int i = 0; i < arg3.getLength(); i++) {
// getQName() предназначен для получения имени атрибута,
System.out.print(arg3.getQName(i) + "=/"" + arg3.getValue(i) + "/"");
}
}
System.out.print(arg2 + ":");
super.startElement(arg0, arg1, arg2, arg3);
}
}
импортировать javax.xml.parsers.SAXParser;
импортировать javax.xml.parsers.SAXParserFactory;
общественный класс TestDemo {
public static void main(String[] args) выдает исключение {
// 1. Создать экземпляр объекта SAXParserFactory
Фабрика SAXParserFactory = SAXParserFactory.newInstance();
// 2. Создаем парсер
Парсер SAXParser = Factory.newSAXParser();
// 3. Получить документ, который необходимо проанализировать, сгенерировать анализатор и, наконец, проанализировать документ
Файл f = новый файл("books.xml");
SaxHandler dh = новый SaxHandler();
parser.parse(f, dh);
}
}
Начать разбор книг элементов
книги:
Начать разбор книги элементов
id="001"книга:
Начать анализ заголовка элемента
Название:Гарри Поттер
Завершение заголовка элемента синтаксического анализа
Начать разбор автора элемента
автор:Дж. К. Роулинг
Завершить разбор элемента автора
Завершить разбор книги элементов
Начать разбор книги элементов
id="002"книга:
Начать анализ заголовка элемента
title:Изучение XML
Завершение заголовка элемента синтаксического анализа
Начать разбор автора элемента
автор:Эрик Т. Рэй
Завершить разбор элемента автора
Завершить разбор книги элементов
Завершить разбор книг элементов
…………Завершение анализа документа…………
Чтобы выполнить этот процесс более четко, мы также можем переписать SaxHandler, чтобы восстановить исходный XML-документ.
Переопределенный класс SaxHandler:
публичный класс SaxHandler расширяет DefaultHandler {
@Override
общественные недействительные символы (char[] arg0, int arg1, int arg2) выбрасывает SAXException {
System.out.print(новая строка(arg0, arg1, arg2));
super.characters(arg0, arg1, arg2);
}
@Override
public void endDocument() выдает SAXException {
System.out.println("/n завершает анализ");
супер.конечныйДокумент();
}
@Override
public void endElement (String arg0, String arg1, String arg2)
выдает SAXException {
System.out.print("</");
System.out.print(arg2);
System.out.print(">");
super.endElement(arg0, arg1, arg2);
}
@Override
public void startDocument() выдает исключение SAXException {
System.out.println("Начать анализ");
String s = "<?xml version="1.0/"coding="UTF-8/"?>";
System.out.println(s);
супер.startDocument();
}
@Override
public void startElement(String arg0, String arg1, String arg2,
Атрибуты arg3) выбрасывает SAXException {
System.out.print("<");
System.out.print(arg2);
если (arg3 != ноль) {
for (int i = 0; i < arg3.getLength(); i++) {
System.out.print(" " + arg3.getQName(i) + "=/"" + arg3.getValue(i) + "/"");
}
}
System.out.print(">");
super.startElement(arg0, arg1, arg2, arg3);
}
}
Теперь он выглядит намного лучше, и его восстановление лучше иллюстрирует процесс анализа.