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

Здесь есть возможность читать онлайн «Д. Стефенс - C++. Сборник рецептов» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Москва, Год выпуска: 2007, ISBN: 2007, Издательство: КУДИЦ-ПРЕСС, Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

C++. Сборник рецептов: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «C++. Сборник рецептов»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

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

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

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «C++. Сборник рецептов», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

if (uri != xmlns)

throw runtime_error(

string("wrong namespace uri ") + toNative(uri)

);

if (localname == animal) {

// Добавить в список объект Animal; это будет

// "текущий объект Animal"

animalList_.push_back(Animal());

} else if (localname != animalList) {

Animal& animal = animalList_.back();

if (localname == vet) {

// Мы встретили элемент "ветеринар".

animal.setVeterinarian(contactFromAttributes(attrs));

} else if (localname == trainer) {

// Мы встретили элемент "дрессировщик".

animal.setTrainer(contactFromAttributes(attrs));

} else {

// Мы встретили элемент "кличка", "вид животного" или

// "дата рождения". Их содержимое будет получено

// при обратном вызове функции characters().

currentText_.clear();

}

}

}

// Если текущий элемент представляет кличку, вид животного или дату

// рождения, используйте хранимый в currentText_ текст для установки

// соответствующего свойства текущего объекта Animal.

void endElement(

const XMLCh *const uri, // URI пространства имен

const XMLCh *const localname, // имя тега без префикса NS

const XMLCh *const qname) // имя тега + префикс NS

{

static XercesString animalList = fromNative("animal-list");

static XercesString animal = fromNative("animal");

static XercesString name = fromNative("name");

static XercesString species = fromNative("species");

static XercesString dob = fromNative("dateOfBirth");

if (localname!= animal && localname!= animalList) {

// currentText_ содержит текст элемента, который был

// добавлен. Используйте его для установки свойств текущего

// объекта Animal.

Animal& animal = animalList_.back();

if (localname == name) {

animal setName(toNative(currentText_));

} else if (localname == species) {

animal.setSpecies(toNative(currentText_));

} else if (localname == dob) {

animal.setDateOfBirth(toNative(currentText_));

}

}

}

// Получает уведомления, когда встречаются символьные данные

void characters(const XMLCh* const chars,

const unsigned int length) {

// Добавить символы в конец currentText_ для обработки методом

// endElement()

currentText_.append(chars, length);

}

private:

vector& animalList_;

XercesString currentText_;

};

Пример 14.7. SAX2 ErrorHandler

#include // runtime_error

#include

// Получает уведомления об ошибках.

class CircusErrorHandler : public DefaultHandler {

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.

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

Интервал:

Закладка:

Сделать

Похожие книги на «C++. Сборник рецептов»

Представляем Вашему вниманию похожие книги на «C++. Сборник рецептов» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


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

Обсуждение, отзывы о книге «C++. Сборник рецептов» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.