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

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

Имена классов Xerces не всегда совладают с именами интерфейсов W3C DOM, которые они реализуют; это происходит из-за того, что Xerces реализует несколько спецификаций в одном пространстве имен и использует префиксы в именах классов, чтобы избежать конфликтов имен.

Понимание примера 14.10 теперь не должно вызывать затруднений. Я начинаю с инициализации Xerces, как это делается в примере 14.8. Затем я получаю >DOMImplementation из >DOMImplementationRegistry, запрашивая функцию загрузки и сохранения путем передачи строки «>LS» статическому методу >DOMImplementationRegistry::getDOMImplementation(). На следующем шаге я получаю >DOMBuilder из >DOMImplementation. Мне приходится тип >DOMImplementation привести к типу >DOMImplementationLS, потому что функция загрузки и сохранения недоступна из интерфейса >DOMImplementation согласно спецификации W3C DOM уровня 1. Первый аргумент >createDOMBuilder() показывает, что возвращаемый парсер будет работать в синхронном режиме. Другой возможный режим, а именно асинхронный режим, в настоящее время не поддерживается в Xerces.

Получив >DOMBuilder, я включаю поддержку пространства имен XML, регистрирую обработчик >ErrorHandler и выполняю синтаксический анализ документа. Парсер возвращает документ в виде >DOMDocument; используя метод >getElementsByTagName() документа >DOMDocument, я получаю объект >DOMElement, соответствующий элементу этого документа >animalList, и просматриваю его дочерние элементы, используя объект типа >DOMNodeList. Когда я нахожу элемент, имеющий дочерний элемент типа >name и содержащий текст «>Herby», я удаляю его из документа с помощью вызова метода корневого элемента >removeChild().

Подобно тому как >SAX2XMLReader имеет метод >parse(), принимающий экземпляр >InputSource, >DOMBuilder имеет метол >parse(), принимающий экземпляр >xercesc::DOMInputSource (т.е. экземпляр абстрактного класса, который инкапсулирует источник символьных данных). В >DOMInputSource предусмотрен конкретный подкласс >Wrapper4DOMInputSource, который может быть использован для преобразования произвольного >InputSource в >xercesc::DOMInputSource. См рецепт 14.3.

Наконец, я получаю объект >DOMWriter из >DOMImplementation (причем делаю это во многом точно так же, как при получении объекта >DOMBuilder) и сохраняю модифицированный документ XML на диск, вызывая его метод >writeNode(), передавая в качестве аргумента корневой элемент документа.

Вы должны освободить указатели, возвращаемые методами с именами вида >DOMImplementation::createXXX(), путем вызова метода >release(). Используйте утилиту >DOMPtr из примера 14.10 для того, чтобы гарантировать освобождение такого указателя, даже если выбрасывается исключение. Необязательно явно удалять указатели, возвращаемые методами, имена которых имеют вид >DOMDocument::createXXX(), хотя это можно делать, если они больше не нужны. Дополнительные сведения вы найдете в документации Xerces.

14.5. Проверка документа XML на соответствие определению DTD

Проблема

Требуется проверить документ XML на соответствие DTD.

Решение

Используйте библиотеку Xerces с парсером SAX2 (простой программный XML-интерфейс) или с парсером DOM.

Для проверки документа XML при использовании SAX2 получите >SAX2XMLReader, как показано в примере 14.8. Затем включите режим проверки DTD, вызывая метод парсера >setFeature() с аргументами >xercesc::XMLUni::fgSAX2CoreValidation и >true. Наконец, зарегистрируйте обработчик >ErrorHandler для получения уведомлений о нарушении DTD и вызовите метод парсера >parse(), указывая в качестве его аргумента имя вашего документа XML.

Для проверки документа XML при использовании парсера DOM сначала сконструируйте экземпляр >XercesDOMParser. Затем включите режим проверки DTD, вызывая метод парсера >setValidationScheme() с аргументом >xercesc::XercesDOMParser::Val_Always. Наконец, зарегистрируйте обработчик >ErrorHandler для получения уведомлений о нарушении DTD и вызовите метод парсера >parse(), указывая в качестве его аргумента имя вашего документа XML.

Здесь я использую класс >XercesDOMParser, т.е. XML-парсер, который входил в состав Xerces еще до того, как был разработан интерфейс >DOMBuilder парсера DOM уровня 3. Применение >XercesDOMParser позволяет немного упростить пример, но при желании вы можете вместо него использовать >DOMBuilder. См. обсуждение этого рецепта и рецепт 14.4.

Для примера предположим, что вы модифицируете документ XML animals.xml из примера 14.1 для того, чтобы он содержал ссылку на внешнее определение DTD, как показано в примерах 14.11 и 14.12. Программный код, выполняющий проверку документа с использованием программного интерфейса SAX2, приводится в примере 14.13; программный код, выполняющий проверку этого документа с использованием парсера DOM, приводится в примере 14.14.

Пример 14.11. DTD animals.dtd для файла animals.xml

>

>

>

>                  veterinarian, trainer) >

>

>

>

>


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