// Добавить символы в конец currentText_ для обработки методом
// endElement()
currentText_.append(chars, length);
}
private:
vector
XercesString currentText_;
};
#include
#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); }
};
#include
#include
#include
#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
// Инициализировать 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
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.