import java.util.Collection;
import java.util.LinkedList;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;
/**
* Парсер XML-файлов с информацией о фильмах
*
* @author Wert Tanya
*/
public class XMLFilmParser extends DefaultHandler{
private Collection<Film> films = new LinkedList<Film>();
/**
* Конструктор парсера.
* Создает парсер и считывает информацию из заданного XML-файла
*
* @param fileName имя файла
* @throws SAXException исключение при разборе
* @throws IOException исключение, связанное с ошибками ввода-вывода
*/
public XMLFilmParser(final String fileName) throws SAXException, IOException {
super();
// Создаем парсер
final XMLReader xr = XMLReaderFactory.createXMLReader();
// Настраиваем обработчик событий разбора
xr.setContentHandler(this);
// Настраиваем обработчик ошибок разбора
xr.setErrorHandler(this);
// Выполняем разбор.
// В процессе разбора вызываются обработчики,
// в том числе startElement().
// Информация о студентах накапливается
// в процессе разбора в коллекции students.
xr.parse(new InputSource(new FileReader(fileName)));
}
/**
* Обработчик события разбора открывающего тэга для элемента
* @param uri универсальный идентификатор ресурсов пространства имен
* @param localName локальное имя элемента (без префикса пространства имен)
* @param qName полное имя элемента (включая префикс пространства имен)
* @param attributes атрибуты
* @throws SAXException исключение при разборе
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if ("films".equals(localName)) {
// Очищаем список фильмов в начале разбора элемента "films"
films.clear();
} else if ("film".equals(localName)) {
// Извлекаем атрибуты для элемента "film"
final String name = attributes.getValue("name");
final String year = attributes.getValue("year");
final String duration = attributes.getValue("duration");
final String budget = attributes.getValue("budget");
// Создаем объект фильма и добавляем в коллекцию фильмов
films.add(new Film(0, name, Integer.parseInt(year), Integer.parseInt(duration),
Integer.parseInt(budget)));
}
}
/**
* Получить список фильмов.
* Создает и возвращает копию коллекции фильмов.
* При изменении копии исходная коллекция остается прежней.
* @return копия коллекции студентов
*/
public Collection<Film> getFilms() {
return new LinkedList<Film>(films);
}
}
Результаты выполнения программы:
Example1:
аргументы командной строки: -o_films
результат:
Manhattan (1979)
The Terminator 2: Judgment Day (1991)
Titanic (1997)
The Lord of the Rings: The Fellowship of the Ring (2001)
The Lord of the Rings: The Two Towers (2002)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.