C++. Сборник рецептов - [192]

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

>

>

> name  CDATA #REQUIRED

> phone CDATA #REQUIRED

>>

>

> name  CDATA #REQUIRED

> phone CDATA #REQUIRED

>>

Пример 14.12. Модифицированный файл animals.xml, содержащий DTD

>

>

>

>

Пример 14.13. Проверка документа animals.xml на соответствие DTD с использованием программного интерфейса SAX2

>/*

>* Операторы #include из примера 14.8, кроме включения вектора который

>здесь не нужен

>*/

>#include // runtime_error

>#include

>using namespace std;

>using namespace xercesc;


>/*

> * Определить XercesInitializer, как это сделано в примере 14.8, и

> * CircusErrorHandler, как это сделано в примере 14.7

> */

>int main() {

> try {

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

>  SAX2 XercesInitializer init;

>  auto_ptr

>   parser(XMLReaderFactory::createXMLReader());

>  // Включить режим проверки

>  parser->setFeature(XMLUni::fgSAX2CoreValidation, true);

>  // Зарегистрировать обработчик ошибок для получения уведомлений о

>  // нарушениях DTD

>  CircusErrorHandler error;

>  parser->setErrorHandler(&error);

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

> } 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;

> }

>}

Пример 14.14. Проверка документа animals.xml на соответствие DTD animals.dtd с использованием парсера XercesDOMParser

>#include

>#include   // cout

>#include // runtime_error

>#include

>#include

>#include

>#include

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


>using namespace std;

>using namespace xercesc;


>/*

> * Определить XercesInitializer, как это сделано в примере 14.8

> * и CircusErrorHandler, как это сделано в примере 14.7

> */

>int main() {

> try {

>  // Инициализировать Xerces и сконструировать DOM-парсер.

>  XercesInitializer init;

>  XercesDOMParser parser;

>  // Включить режим проверки DTD

>  parser.setValidationScheme(XercesDOMParser::Val_Always);

>  // Зарегистрировать обработчик ошибок для получения уведомлений о

>  // нарушениях схемы

>  CircusErrorHandler handler;

>  parser.setErrorHandler(&handler);

>  // Выполнить синтаксический анализ вместе с проверкой.

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

> } 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;

> }

>}

Обсуждение

Определения DTD обеспечивают простой способ наложения ограничений на документ XML. Например, в DTD можно указать, какие элементы допускаются в документе, какие атрибуты может иметь элемент и может ли конкретный элемент содержать дочерние элементы, текст или и то и другое. Можно также накладывать ограничения на тип, порядок следования и количество дочерних элементов, а также на значения атрибутов.

DTD предназначены для определения подмножества правильно сформированных документов XML, которые характерны для определенной прикладной области. Например, в примере 14.1 важно то, что каждый элемент >animal имеет дочерние элементы >name, >species, >dateOfBirth, >veterinarian и >trainer, а элементы >name, >species и >dateOfBirth содержат только текст в то время, как элементы >veterinarian и >trainer имеют атрибуты >name и >phone. Более того, элемент >animal не должен иметь атрибут >phone, а элемент >veterinarian не должен иметь дочерний элемент >species.

DTD в примере 14.11 накладывает ограничения различного типа. Например, приведенное ниже объявление элемента устанавливает необходимость наличия в элементе животного дочерних элементов >name, >species, >dateOfBirth, >veterinarian и >trainer, задаваемых именно в этом порядке.

>

>                  veterinarian, trainer) >

Аналогично приведенное ниже объявление атрибута указывает на то, что элемент >trainer должен иметь атрибуты >name и >phone, а отсутствие в DTD объявлений других атрибутов для элемента дрессировщика говорит о том, что этот элемент может иметь только два атрибута.

>

> name  CDATA #REQUIRED

> phone CDATA #REQUIRED

>>

Документ XML, который содержит DTD и удовлетворяет его требованиям, называют достоверным (valid). XML-парсер, который обнаруживает не только синтаксические ошибки, но и проверяет достоверность документа XML. называется подтверждающим парсером (validating parser). Хотя парсеры >SAX2XMLReader и >XercesDOMParser не являются по умолчанию подтверждающими парсерами, в каждом из них предусмотрена функция подтверждения достоверности, которая может подключаться так, как это сделано в примерах 14.13 и 14.14. Аналогично парсер


Рекомендуем почитать
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 так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.