XMLReaderFactory.createXMLReader(

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

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

setContentHandler(),setErrorHandler(),

setDTDHandler(), setEntityResolver() .

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

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

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

package chapt16.analyzer.sax;

import org.xml.sax.ContentHandler;

import org.xml.sax.Attributes;

 

public class SimpleHandler implements ContentHandler {

 

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);

}

}

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

package chapt16.main;

Import org.xml.sax.XMLReader;

Import org.xml.sax.XMLReaderFactory;

import org.xml.sax.SAXException;

import javax.xml.parsers.ParserConfigurationException;

import java.io.IOException;

import chapt16.analyzer.sax.SimpleHandler;

 

public class SAXSimple {

public static void main(String[] args) {

try {

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

XMLReader reader = XMLReaderFactory.createXMLReader();

SimpleHandler contentHandler = new SimpleHandler();

reader.setContentHandler(contentHandler);

reader.parse("students.xml");

} catch (SAXException e) {

e.printStackTrace();

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

} catch (ParserConfigurationException e) {

e.printStackTrace();

System.out.print("ошибка конфигурации");

} catch (IOException e) {

e.printStackTrace();

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

}

}

}

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

Students

student login=mit faculty=mmf

Name Mitar Alex name

Telephone 2456474 telephone

Address

Country Belarus country

City Minsk city

Street Kalinovsky 45 street

Address

Student

student login=pus faculty=mmf

Name Pashkun Alex name

Telephone 3453789 telephone

Address

Country Belarus country

City Brest city

Street Knorina 56 street

Address

Student

Students

В следующем приложении производятся разбор документа students.xml и инициализация на его основе коллекции объектов класса Student.

/* пример # 3 : формирование коллекции объектов на основе XML-документа : StudentHandler.java */

packagechapt16.analyzer.sax;

 

enumStudentEnum {

NAME, TELEPHONE, STREET, CITY, COUNTRY

}

packagechapt16.analyzer.sax;

import org.xml.sax.Attributes;

import org.xml.sax.ContentHandler;

import java.util.ArrayList;

import chapt16.entity.Student;

 

public class StundentHandler implements ContentHandler {

ArrayList<Student> students = new ArrayList<Student>();

Student curr = null;

StudentEnum currentEnum = null;

 

public ArrayList<Student> getStudents() {

return students;

}

public void startDocument() {

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

}

public void startElement(String uri, String localName,

String qName, Attributes attrs) {

if (qName.equals("student")) {

curr = new Student();

curr.setLogin(attrs.getValue(0));

curr.setFaculty(attrs.getValue(1));

}

if(!"address".equals(qName) &&

!"student".equals(qName) &&

!qName.equals("students"))

currentEnum =

StudentEnum.valueOf(qName.toUpperCase());

}

public void endElement(String uri, String localName,

String qName) {

if(qName.equals("student"))

students.add(curr);

currentEnum = null;

}

public void characters(char[] ch, int start,

int length) {

String s = new String(ch, start, length).trim();

if(currentEnum == null) return;

switch (currentEnum) {

case NAME:

curr.setName(s);

break;

case TELEPHONE:

curr.setTelephone(s);

break;

case STREET:

curr.getAddress().setStreet(s);

break;

case CITY:

curr.getAddress().setCity(s);

break;

case COUNTRY:

curr.getAddress().setCountry(s);

break;

}

}

}

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

package chapt16.main;