Д. Стефенс - C++. Сборник рецептов

Тут можно читать онлайн Д. Стефенс - C++. Сборник рецептов - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming, издательство КУДИЦ-ПРЕСС, год 2007. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    C++. Сборник рецептов
  • Автор:
  • Жанр:
  • Издательство:
    КУДИЦ-ПРЕСС
  • Год:
    2007
  • Город:
    Москва
  • ISBN:
    5-91136-030-6
  • Рейтинг:
    3.9/5. Голосов: 101
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Д. Стефенс - C++. Сборник рецептов краткое содержание

C++. Сборник рецептов - описание и краткое содержание, автор Д. Стефенс, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Данная книга написана экспертами по C++ и содержит готовые рецепты решения каждодневных задач для программистов на С++. Один из авторов является создателем библиотеки Boost Iostreams и нескольких других библиотек C++ с открытым исходным кодом. В книге затрагивается множество тем, вот лишь некоторые из них: работа с датой и временем; потоковый ввод/вывод; обработка исключений; работа с классами и объектами; сборка приложений; синтаксический анализ XML-документов; программирование математических задач. Читатель сможет использовать готовые решения, а сэкономленное время и усилия направить на решение конкретных задач.

C++. Сборник рецептов - читать онлайн бесплатно полную версию (весь текст целиком)

C++. Сборник рецептов - читать книгу онлайн бесплатно, автор Д. Стефенс
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

public:

void warning(const SAXParseException& e) {

/* нет действий */

}

void error(const SAXParseExceptionf& e) {

throw runtime_error(toNative(e.getMessage()));

}

void fatalError(const SAXParseException& e) { error(e); }

};

Пример 14.8. Синтаксический анализ документа animals.xml при помощи программного интерфейса SAX2

#include

#include // cout

#include // auto_ptr

#include

#include

#include

#include

#include "animal.hpp"

#include "xerces_strings.hpp" // Пример 14.4

using namespace std;

using namespace xercesc;

// Утилита RAII инициализирует парсер и освобождает ресурсы

// при выходе из области видимости

class XercesInitializer {

public:

XercesInitializer() { XMLPlatformUtils::Initialize(); }

~XercesInitializer() { XMLPlatformUtils::Terminate(); }

private:

// Запретить копирование и присваивание

XercesInitializer(const XercesInitializer&);

XercesInitializer& operator=(const XercesInitializer&);

};

int main() {

try {

vector animalList;

// Инициализировать Xerces и получить парсер

XercesInitializer init;

auto_ptr

parser(XMLReaderFactory::createXMLReader());

// Зарегистрировать обработчики

CircusContentHandler content(animalList);

CircusErrorHandler error;

parser->setContentHandler(&content);

parser->setErrorHandler(&error);

// Выполнить синтаксический анализ документа XML

parser->parse("animals.xml");

// Напечатать клички животных

for (vector::size_type i = 0;

n = animalList.size(); i < n; ++i) {

cout << animalList[i] << "\n";

}

} catch (const SAXException& e) {

cout << "xml error: " << toNative(e.getMessage()) << "\n";

return EXIT_FAILURE;

} catch (const XMLException& e) {

cout << "xml error: " << toNative(e.getMessage()) << "\n";

return EXIT_FAILURE;

} catch (const exception& e) {

cout << e.what() << "\n";

return EXIT_FAILURE;

}

}

Обсуждение

Некоторые парсеры XML выполняют синтаксический анализ документа XML и возвращают его пользователю в виде сложного объекта С++. Именно это делает парсер TinyXml и парсер W3C DOM, который будет рассмотрен в следующем рецепте. В отличие от них парсер SAX2 использует ряд функций обратного вызова для передачи пользователю информации о документе XML по ходу его анализа. Функции обратного вызова сгруппированы в несколько интерфейсов обработчиков: ContentHandlerполучает уведомления об элементах, атрибутах и о тексте документа XML, ErrorHandlerполучает предупреждения и сообщения об ошибках, a DTDHandlerполучает уведомления о DTD документа XML.

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

Пример 14.8 достаточно простой: я получаю парсер SAX2, регистрирую ContentHandlerи ErrorHandler, анализирую документ animals.xmlи печатаю список объектов Animal, заполненный обработчиком ContentHandler. Следует отметить два интересных момента: во-первых, функция XMLReaderFactory::createXMLReader()возвращает экземпляр SAX2XMLReader, память под который выделяется динамически и должна освобождаться пользователем в явной форме; для этой цели я использую std::auto_ptr, чтобы обеспечить удаление парсера даже в случае возникновения исключения. Во-вторых, среда Xerces должна быть инициализирована, используя xercesc::XMLPlatformUtils::Initialize(), и очищена при помощи xercesc::XMLPlatformUtils::Terminate(). Я инкапсулирую эту инициализацию и очистку в классе XercesInitializer, который вызывает XMLPlatformUtils::Initialize()в своем конструкторе и XMLPlatformUtils::Terminate()в своем деструкторе. Это гарантирует вызов Terminate(), даже если выбрасывается исключение. Это пример метода захвата ресурса при инициализации ( Resource Acquisition Is Initialization — RAII), который был продемонстрирован в примере 8.3.

Давайте теперь посмотрим, как класс CircusContentHandlerиз примера 14.6 реализует интерфейс SAX2 ContentHandler. Парсер SAX 2 вызывает метод startElement()при каждой встрече открывающего тега элемента. Если элементу приписано пространство имен, первый аргумент, uri, будет содержать URI пространства имен элемента, а второй аргумент, localname, будет содержать ту часть имени тега элемента, которая идет за префиксом пространства имен. Если элемент не имеет пространства имен, эти два аргумента будут иметь пустые строки. Третий аргумент содержит имя тега элемента, если с элементом не связывается пространство имен; в противном случае этот аргумент может содержать либо имя тега элемента в том виде, в каком оно встречается в анализируемом документе, либо пустую строку. Четвертым аргументом является экземпляр класса Attributes, представляющего набор атрибутов элемента.

В приведенной в примере 14.6 реализации startElement()я игнорирую элемент animalList. Когда я встречаю элемент animal, я добавляю новый объект Animalв список животных; назовем его текущим объектом Animalи предоставим право установки свойств этого Animalобработчикам других элементов. Когда я встречаю элемент veterinarianили trainer, я вызываю функцию contactFromAttributesдля конструирования экземпляра Contactиз набора атрибутов элемента и затем использую этот объект Contactдля установки свойств ветеринара и дрессировщика в текущем элементе Animal. Когда я встречаю элемент name, speciesили dateOfBirth, я очищаю переменную-член currentText_, которая будет использоваться для хранения текстового содержимого этого элемента.

Парсер SAX2 вызывает метод characters()для передачи символьных данных, содержащихся в элементе. Этот парсер может передавать символы элемента с помощью нескольких вызовов метода characters(); пока не встретится закрывающий тег, нельзя быть уверенным в передаче всех символьных данных. Поэтому в реализации characters()я просто добавляю полученные символы в конец переменной-члена currentText_, которую я использую для установки клички, вида и даты рождения Animalсразу после встречи закрывающего тега для элемента name, speciesили dateOfBirth.

Парсер SAX2 вызывает метод endElement()при выходе из каждого элемента. Его аргументы имеют тот же смысл, который имеют первые три аргумента метода startElement(). В реализации endElement(), приведенной в примере 14.6, я игнорирую все элементы, отличные от name, speciesи dateOfBirth. Когда происходит обратный вызов, соответствующий одному из этих элементов, сигнализирующий о сделанном только что выходе парсера из элемента, я использую символьные данные, сохраненные в currentText_для установки клички, вида и даты рождения текущего объекта Animal.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Д. Стефенс читать все книги автора по порядку

Д. Стефенс - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




C++. Сборник рецептов отзывы


Отзывы читателей о книге C++. Сборник рецептов, автор: Д. Стефенс. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x