Изучаем Java EE 7 - [188]

Шрифт
Интервал

>javax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl

>javax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl

>javax.xml.transform.TransformerFactory=org.apache.xalan.processor.TransformerFactoryImpl

Другой способ заключается в настройке системных свойств Java перед запуском приложения. Например, следующее системное свойство указывает JVM использовать Xerces как анализатор XML:

>-Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl

Основные свойства системы, которые можно изменить, чтобы ввести новые анализаторы или преобразователи, приведены в табл. 12.6.


Таблица 12.6. Системные свойства для конфигурации анализаторов/преобразователей XML
Системное свойствоОписание
javax.xml.parsers.DocumentBuilderFactoryУстанавливает строитель DOM
javax.xml.parsers.SAXParserFactoryКонфигурирует анализатор SAX
javax.xml.transform.TransformerFactoryОпределяет, какую реализацию XSLT следует использовать

JAXP и SAX

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

Способ обработки текущего элемента XML-документа без сохранения состояния ранее проанализированных элементов называется обработкой, не зависящей от состояния. Это наиболее подходящая модель обработки XML-ресурсов с помощью анализаторов SAX. Другой вариант — обработка, зависящая от состояния, которая обрабатывается такими анализаторами, как StAX.

В листинге 12.4 показан класс, который анализирует документ order.xml с помощью модели SAX, основанной на событиях. Класс SaxParsing наследуется от класса DefaultHandler, который требуется для решения различных задач анализа и реализует четыре различных обработчика (ContentHandler, ErrorHandler, DTDHandler и EntityResolver). SAXParserFactory настраивает и создает объект анализатора SAX. Как упоминалось ранее, можно вручную настроить системное свойство javax.xml.parsers.SAXParserFactory на использование сторонних анализаторов SAX. SAXParser является оберткой объекта SAXReader, на который может ссылаться getXMLReader(), поэтому, когда вызывается метод parse() анализатора SAX, читатель вызывает один из нескольких методов обработчика, реализованных приложением (например, метод StartElement).


Листинг 12.4. Анализатор SAX, обрабатывающий документ, который хранит информацию о заказе

>public class SaxParsing extends DefaultHandler {


>··private List orderLines = new ArrayList<>();

>··private OrderLine orderLine;

>··private Boolean dealingWithUnitPrice = false;

>··private StringBuffer unitPriceBuffer;


>··public List parseOrderLines() {


>····try {

>······File xmlDocument = Paths.get("src/main/resources/order.xml"). toFile();


>······// Фабрика SAX

>······SAXParserFactory factory = SAXParserFactory.newInstance();

>······SAXParser saxParser = factory.newSAXParser();


>······// Анализ документа

>······saxParser.parse(xmlDocument, this);

>····}··catch (SAXException | IOException | ParserConfigurationException e) {

>······e.printStackTrace();

>····}

>····return orderLines;

>··}


>··@Override

>··public void startElement(String namespaceURI, String localName, String qualifiedName,

>···························Attributes attrs) throws SAXException {


>····switch (qualifiedName) {

>······// Получение узла order_line

>······case "order_line":

>········orderLine = new OrderLine();

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

>··········switch (attrs.getLocalName(i)) {

>············case "item":

>··············orderLine.setItem(attrs.getValue(i));

>··············break;

>············case "quantity":

>··············orderLine.setQuantity(Integer.valueOf(attrs.getValue(i)));

>··············break;

>··········}

>········}

>········break;

>······case "unit_price":

>········dealingWithUnitPrice = true;

>········unitPriceBuffer = new StringBuffer();

>········break;

>····}

>··}

>··@Override

>··public void characters(char[] ch, int start, int length) throws SAXException {

>······if (dealingWithUnitPrice)

>········unitPriceBuffer.append(ch, start, length);

>··}


>··@Override

>··public void endElement(String namespaceURI, String localName, String qualifiedName)

>·························throws SAXException {


>····switch (qualifiedName) {

>······case "order_line":

>········orderLines.add(orderLine);

>········break;

>······case "unit_price":

>········orderLine.setUnitPrice(Double.valueOf(unitPriceBuffer.toString()));

>········dealingWithUnitPrice = false;

>········break;

>····}

>··}

>}

Интерфейс ContentHandler обрабатывает основные связанные с документами события, такие как начало и конец элемента, с помощью методов startDocument, endDocument, startElement и endElement. Эти методы вызываются, когда встречаются открывающий или закрывающий теги XML. В примере, приведенном выше (см. листинг 12.4), метод startElement проверяет, является ли элемент order_Line либо unit_price, чтобы или создать объект типа OrderLine, или получить значение цены за единицу товара. Интерфейс ContentHandler также имеет метод characters(), который вызывается, когда анализатор встречает группу символов в элементе XML (в примере выше (см. листинг 12.4) метод characters() помещает в буфер цену за каждый товар).


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.