C++. Сборник рецептов - [197]
> LocalFileInputSource src(место-расположения-документа);
> XalanDocument* doc = liaison.ParseXMLStream(doc);
> ...
>}
Можно поступить по-другому и использовать парсер Xerces DOM для получения указателя на >DOMDocument
, как это сделано в примере 14.14, и затем использовать экземпляры >XercesDOMSupport
, >XercesParserLiaison
и >XercesDOMWrapperParsedSource
, каждый из которых определяется в пространстве имен >xalanc
для получения указателя на >XalanDocument
, соответствующего документу >DOMDocument
.
>#include
>#include
>#include
>#include
>...
>int main() {
> ...
> DOMDocument* doc = ...;
> XercesDOMSupport support;
> XercesParserLiaison liaison(support);
> XercesDOMWrapperParsedSource src(doc, liaison, support);
> XalanDocument* xalanDoc = src.getDocument();
> ...
>}
На следующем шаге получите указатель на узел, выполняющий роль узла контекста при вычислении выражения XPath. Это можно сделать с помощью интерфейса DOM документа >XalanDocument
. Сконструируйте >XPathEvaluator
для вычисления выражения XPath и >XalanDocumentPrefixResolver
для разрешения префиксов пространств имен в документе XML. Наконец, вызовите метод >XPathEvaluator::evaluate()
, передавая в качестве аргументов >DOMSupport
, контекстный узел, XPath-выражение и >PrefixResolver
. Результат вычисления выражения возвращается в виде объекта типа >XObjectPtr
; тип допустимых операций над этим объектом зависит от типа его данных XPath, который можно узнать при помощи метода >getType()
.
Например, пусть требуется извлечь список имен животных из документа animals.xml, представленного в примере 14.1. Вы можете это сделать, выполняя синтаксический анализ документа и вычисляя XPath-выражение >animalList/animal/name/child::text()
с использованием корня документа в качестве контекстного узла. Это проиллюстрировано в примере 14.23.
Пример 14.23. Вычисление ХРаth-выражения, используя Xalan
>#include
>#include
>#include
>#include
>#include
>#include
>#include
>#include
>#include
>#include
>#include
>#include
>#include
>#include "animal.hpp"
>#include "xerces_strings.hpp"
>using namespace std;
>using namespace xercesc;
>using namespace xalanc;
>// Утилита RAII, которая инициализирует парсер и процессор XPath, освобождая
>// ресурсы при выходе из области видимости
>class XPathInitializer {
>public:
> XPathInitializer() {
> XMLPlatformUtils::Initialize();
> XPathEvaluator::initialize();
>}
>~XPathInitializer() {
> XpathEvaluator::terminate();
> XMLPlatformUtils::Terminate();
>}
>private:
> // Запретить копирование и присваивание
> XPathInitializer(const XPathInitializer&);
> XPathInitializer& operator=(const XPathInitializer&);
>};
>// Получает уведомления об ошибках
>class CircusErrorHandler : public DefaultHandler {
>public:
> void error(const SAXParseException& e) {
> throw runtime_error(toNative(e.getMessage()));
> }
> void fatalError(const SAXParseException& e) { error(e); }
>};
>int main() {
> try {
> // Инициализировать Xerces и XPath и сконструировать парсер DOM.
> XPathInitializer init;
> XercesDOMParser parser;
> // Зарегистрировать обработчик ошибок
> CircusErrorHandler error;
> parser.setErrorHandler(&error);
> // Выполнить синтаксический анализ animals.xml.
> parser.parse(fromNative("animals.xml").c_str());
> DOMDocument* doc = parser.getDocument();
> DOMElement* animalList = doc->getDocumentElement();
> // Создать XalanDocument на основе doc.
> XercesDOMSupport support;
> XercesParserLiaison liaison(support);
> XercesDOMWrapperParsedSource src(doc, liaison, support);
> XalanDocument* xalanDoc = src.getDocument();
> // Вычислить XPath-выражение для получения списка
> // текстовых узлов, содержащих имена животных
> XPathEvaluator evaluator;
> XalanDocumentPrefixResolver resolver(xalanDoc);
> XercesString xpath =
> fromNative("animalList/animal/name/child::text()");
> XObjectPtr result =
> evaluator.evaluate(
> support, // поддержка DOM
> xalanDoc, // контекстный узел
> xpath.c_str(), // XPath-выражение
> resolver); // функция разрешения пространства имен
> const NodeRefListBase& nodeset = result->nodeset();
> // Просмотр списка узлов и вывод имен животных
> for (size_t i = 0, len = nodeset.getLength(); i < len; ++i) {
> const XMLCh* name = nodeset.item(i)->getNodeValue().c_str();
> std::cout << toNative(name) << "\n";
> }
> } 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;
> }
>}
XPath — это язык поиска по образцу (pattern matching language), предназначенный для извлечения информации из документов XML. Основная конструкция XPath —
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.