Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Событийная модель

В текстовых блоках нельзя использовать символы | Faculty CDATA #REQUIRED | ERROR - 14 : 41 - cvc-attribute.3: The value 'mit' of attribute 'login' on element 'student' is not valid with respect to its type, 'login'. | Xjc university.xsd | Org.w3c.dom.Text | Изменение XML-документа | XMLStreamConstants.ENTITY_DECLARATION | Student: Login: mit Faculty: mmf |


Читайте также:
  1. HONDA: МОДЕЛЬ СТРАТЕГИИ
  2. III.I. Механістична модель.
  3. III.II. Органічна модель.
  4. Автоматическая модель расчета движения денежных средств инвестиционного проекта и критериев его экономической эффективности
  5. Бизнес-модель
  6. Бизнес-модель
  7. Введение в систему программирования VBA. Объектная модель Excel, основные объекты Е. Краткая их характеристика.

Как уже отмечалось, SAX-анализатор не строит дерево элементов по содержимому XML-файла. Вместо этого анализатор читает файл и генерирует события, когда находит элементы, атрибуты или текст. На первый взгляд, такой подход менее естествен для приложения, использующего анализатор, так как он не строит дерево, а приложение само должно догадаться, какое дерево элементов описывается в XML-файле.

Однако нужно учитывать, для каких целей используются данные из XML-файла. Очевидно, что нет смысла строить дерево объектов, содержащее десятки тысячи элементов в памяти, если всё, что необходимо, – это просто посчитать точное количество элементов в файле.

SAX-анализаторы

SAX API определяет ряд интерфейсов, используемых при разборе документа. Чаще других используется org.xml.sax.ContentHandler и объявленные в нем методы:

void startDocument() – вызывается на старте обработки документа;

void endDocument() – вызывается при завершении разбора документа;

void startElement(String uri, String localName, String qName, Attributes attrs) – будет вызван, когда анализатор полностью обработает содержимое открывающего тега, включая его имя и все содержащиеся атрибуты;

void endElement(String uri, String localName, String qName) – сигнализирует о завершении элемента;

void characters(char[] ch, int start, int length) – вызывается в том случае, если анализатор встретил символьную информацию внутри элемента (тело тега). Если этой информации достаточно много, то метод может быть вызван более одного раза.

Для обработки предупреждений и ошибок, возникающих при разборе XML-документа применяется интерфейс org.xml.sax.ErrorHandler, содержащий методы:

warning(SAXParseException e), error(SAXParseException e), fatalError(SAXParseException e).

В пакете org.xml.sax в SAX2 API содержатся также интерфейсы org.xml.sax.DTDHandler, org.xml.sax.DocumentHandler и org.xml.sax.EntityResolver, которые необходимо реализовать для обработки интересующего события.

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

1. Создать класс, который реализует один или несколько интерфейсов (ContentHandler, ErrorHandler, DTDHandler, EntityResolver, DocumentHandler) или наследует класс org.xml.sax.helpers.DefaultHandler и реализовать методы, отвечающие за обработку интересующих событий.

2. Используя SAX2 API, поддерживаемое всеми SAX-парсерами, создать org.xml.sax.XMLReader, например:

XMLReader reader =

XMLReaderFactory.createXMLReader(

”org.apache.xerces.parsers.SAXParser”);

3. Передать в XMLReader объект класса, созданного на шаге 1 с помощью соответствующих методов:

setContentHandler(), setErrorHandler(),

setDTDHandler(), setEntityResolver().

4. Вызвать метод parse(String filename) класса XMLReader, которому в качестве параметров передать путь (URI) к анализируемому документу либо InputSource.

Следующий пример выводит на консоль содержимое XML-документа.

/* # 5: чтение и вывод XML-документа: SimpleHandler.java */

package by.bsu.chapt16.analyzer.sax;

import org.xml.sax.helpers.DefaultHandler;

import org.xml.sax.Attributes;

 

public class SimpleHandler extends DefaultHandler {

public void startDocument() {

System. out. println("parsing started");

}

public void startElement(String uri, String localName,

String qName, Attributes attrs) {

String s = qName;

//получение и вывод информации об атрибутах элемента

for (int i = 0; i < attrs.getLength(); i++) {

s += " " + attrs.getQName(i) + "="

+ attrs.getValue(i) + " ";

}

System. out. print(s.trim());

}

public void characters(char [] ch,

int start, int length) {

System. out. print(new String(ch, start, length));

}

public void endElement(String uri,

String localName, String qName) {

System. out. print(qName);

}

public void endDocument() {

System. out. println("parsing ended");

}

}

/* пример # 6: создание и запуск парсера: SAXSimpleMain.java*/

package chapt16.main;

import org.xml.sax.XMLReader;

import org.xml.sax.helpers.XMLReaderFactory;

import org.xml.sax.SAXException;

import java.io.IOException;

import chapt16.analyzer.sax.SimpleHandler;

 

public class SAXSimpleMain {

public static void main(String[] args) {

try {

//создание SAX-анализатора

XMLReader reader = XMLReaderFactory.createXMLReader();

SimpleHandler handler = new SimpleHandler();

reader.setContentHandler(handler);

reader.parse("students.xml");

} catch (SAXException e) {

e.printStackTrace();

System. out. print("ошибка SAX парсера");

} catch (IOException e) {

e.printStackTrace();

System. out. print("ошибка I/О потока");

}

}

}

В результате в консоль будет выведено (в XML-документе не должно быть ссылки на DTD):


Дата добавления: 2015-11-14; просмотров: 58 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Древовидная и событийная модели| Parsing started

mybiblioteka.su - 2015-2024 год. (0.011 сек.)