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) >

>

>

>

>


Рекомендуем почитать
Изучаем Java EE 7

Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)


Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


Фундаментальные алгоритмы и структуры данных в Delphi

Книга "Фундаментальные алгоритмы и структуры данных в Delphi" представляет собой уникальное учебное и справочное пособие по наиболее распространенным алгоритмам манипулирования данными, которые зарекомендовали себя как надежные и проверенные многими поколениями программистов. По данным журнала "Delphi Informant" за 2002 год, эта книга была признана сообществом разработчиков прикладных приложений на Delphi как «самая лучшая книга по практическому применению всех версий Delphi».В книге подробно рассматриваются базовые понятия алгоритмов и основополагающие структуры данных, алгоритмы сортировки, поиска, хеширования, синтаксического разбора, сжатия данных, а также многие другие темы, тесно связанные с прикладным программированием.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.


Как пасти котов. Наставление для программистов, руководящих другими программистами

«Как пасти котов» – это книга о лидерстве и руководстве, о том, как первое совмещать со вторым. Это, если хотите, словарь трудных случаев управления IT-проектами. Программист подобен кошке, которая гуляет сама по себе. Так уж исторически сложилось. Именно поэтому так непросто быть руководителем команды разработчиков. Даже если вы еще месяц назад были блестящим и дисциплинированным программистом и вдруг оказались в роли менеджера, вряд ли вы знаете, с чего надо начать, какой выбрать стиль руководства, как нанимать и увольнять сотрудников, проводить совещания, добиваться своевременного выполнения задач.