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;