Подобно парсеру TinyXml парсер Xerces DOM на выходе формирует документ XML в виде объекта C++, имеющего структуру дерева, узлы которого представляют компоненты документа. Однако парсер Xerces существенно сложнее: например, в отличие от TinyXml он «понимает» пространства имен XML и может выполнять синтаксический анализ сложных DTD. Этим парсером также формируется гораздо более детальное представление документа XML, включающее инструкции обработки и URI пространств имен, относящиеся к элементам и атрибутам. Очень важно то, что он предоставляет доступ к информации через интерфейс, описанный в спецификации W3C DOM.
Спецификация W3C, которая все еще дорабатывается, имеет несколько «уровней»; в настоящее время предусматривается три уровня. Классы DOMImplementation
, DOMDocument
, DOMElement
и DOMNodeList
, использованные в примере 14.10, описываются на уровне 1 спецификации DOM. Классы DOMBuilder
и DOMWrite
описываются на уровне 3 спецификации DOM как часть рекомендаций по функции загрузки и сохранения (Load и Save).
Понимание примера 14.10 теперь не должно вызывать затруднений. Я начинаю с инициализации Xerces, как это делается в примере 14.8. Затем я получаю DOMImplementation
из DOMImplementationRegistry
, запрашивая функцию загрузки и сохранения путем передачи строки «LS
» статическому методу DOMImplementationRegistry::getDOMImplementation()
. На следующем шаге я получаю DOMBuilder
из DOMImplementation
. Мне приходится тип DOMImplementation
привести к типу DOMImplementationLS
, потому что функция загрузки и сохранения недоступна из интерфейса DOMImplementation
согласно спецификации W3C DOM уровня 1. Первый аргумент createDOMBuilder()
показывает, что возвращаемый парсер будет работать в
Получив 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()
, передавая в качестве аргумента корневой элемент документа.