Чтение онлайн

на главную - закладки

Жанры

C++. Сборник рецептов

Когсуэлл Джефф

Шрифт:

return child->getTextContent;

}

 }

 return 0;

}

int main {

 try {

// Инициализировать Xerces и получить DOMImplementation;

// указать, что требуется функция загрузки и сохранения (Load and

// Save - LS)

XercesInitializer init;

DOMImplementation* impl =

DOMImplementationRegistry::getDOMImplementation(fromNative("LS").c_str

);

if (impl == 0) {

cout << "couldn't create DOM implementation\n";

return EXIT_FAILURE;

}

//
Сконструировать DOMBuilder для анализа документа animals.xml.

DOMPtr<DOMBuilder> parser =

static_cast<DOMImplementationLS*>(impl)->

createDOMBuilder(DOMImplementationLS::MODE_SYNCHRONOUS, 0);

// Подключить пространства имен (они не требуются в этом примере)

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

// Зарегистрировать обработчик ошибок

CircusErrorHandler err;

parser->setErrorHandler(&err);

// Выполнить синтаксический анализ animals.xml; здесь можно

// использовать URL вместо имени файла

DOMDocument* doc =

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

// Найти элемент слона Herby: сначала получить указатель на элемент

// "animalList".

DOMElement* animalList = doc->getDocumentElement;

if (animalList->getTagName != fromNative("animalList")) {

cout << "bad document root: "

<< toNative(animalist->getTagName) << "\n";

return EXIT_FAILURE;

}

// Затем просматривать элементы "animal", пытаясь найти элемент слона

// Herby.

DOMNodeList* animals =

animaIList->getElementsByTagName(fromNative("animal").c_str);

for (size_t i = 0,

len = animals->getLength; i < len; ++i) {

DOMElement* animal =

static_cast<DOMElement">(animals->item(i));

const XMLCh* name = getAnimalName(animal);

if (name != 0 && name == fromNative("Herby")) {

// Herby найден - удалить его из документа.

animalList->removeChild(animal);

animal->release;

// необязательный оператор.

break;

}

}

// Сконструировать DOMWriter для сохранения animals.xml.

DOMPtr<DOMWriter> writer =

static cast<DOMImplementationLS*>(impl)->createDOMWriter;

writer->setErrorHandler(&err);

//
Сохранить animals.xml.

LocalFileFormatTarget file("animals.xml");

writer->writeNode(&file, *animalList);

 } catch (const SAXException& e) {

cout << "xml error: " << toNative(e.getMessage) << "\n";

return EXIT_FAILURE;

 } catch (const DOMException& e) {

cout << "xml error: " << toNative(e.getMessage) << "\n";

return EXIT_FAILURE;

 } catch (const exception& e) {

cout << e.what << "\n";

return EXIT_FAILURE;

 }

}

Обсуждение

Подобно парсеру 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).

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

Понимание примера 14.10 теперь не должно вызывать затруднений. Я начинаю с инициализации Xerces, как это делается в примере 14.8. Затем я получаю

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

Поделиться:
Популярные книги

Секретарша генерального

Зайцева Мария
Любовные романы:
современные любовные романы
эро литература
короткие любовные романы
8.46
рейтинг книги
Секретарша генерального

6 Секретов мисс Недотроги

Суббота Светлана
2. Мисс Недотрога
Любовные романы:
любовно-фантастические романы
эро литература
7.34
рейтинг книги
6 Секретов мисс Недотроги

Измена. Ты меня не найдешь

Леманн Анастасия
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Ты меня не найдешь

Инвестиго, из медика в маги

Рэд Илья
1. Инвестиго
Фантастика:
фэнтези
городское фэнтези
попаданцы
5.00
рейтинг книги
Инвестиго, из медика в маги

Генерал-адмирал. Тетралогия

Злотников Роман Валерьевич
Генерал-адмирал
Фантастика:
альтернативная история
8.71
рейтинг книги
Генерал-адмирал. Тетралогия

Вернуть невесту. Ловушка для попаданки

Ардова Алиса
1. Вернуть невесту
Любовные романы:
любовно-фантастические романы
8.49
рейтинг книги
Вернуть невесту. Ловушка для попаданки

Беглец

Бубела Олег Николаевич
1. Совсем не герой
Фантастика:
фэнтези
попаданцы
8.94
рейтинг книги
Беглец

Избранное. Компиляция. Книги 1-11

Пулман Филип
Фантастика:
фэнтези
героическая фантастика
5.00
рейтинг книги
Избранное. Компиляция. Книги 1-11

Я сделаю это сама

Кальк Салма
1. Магический XVIII век
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Я сделаю это сама

"Фантастика 2025-1". Книги 1-30

Москаленко Юрий
Фантастика 2025. Компиляция
Фантастика:
фэнтези
боевая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Фантастика 2025-1. Книги 1-30

Бастард Императора. Том 6

Орлов Андрей Юрьевич
6. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Бастард Императора. Том 6

Локки 4 Потомок бога

Решетов Евгений Валерьевич
4. Локки
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Локки 4 Потомок бога

Брачный сезон. Сирота

Свободина Виктория
Любовные романы:
любовно-фантастические романы
7.89
рейтинг книги
Брачный сезон. Сирота

Владыка морей ч.1

Чайка Дмитрий
10. Третий Рим
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Владыка морей ч.1