Вход/Регистрация
Программирование на Visual C++. Архив рассылки
вернуться

Jenter Алекс

Шрифт:

hr = spXMLDOM->load(CComVariant(L"xmldata.xml"), &bSuccess);

if (FAILED(hr)) throw "Unable to load XML document into the parser";

if (!bSuccess) throw "Unable to load XML document into the parser";

Поиск узла осуществляется через объект документа, поэтому мы используем IXMLDOMDocument::selectSingleNode для обнаружения нужного узла по его имени. Есть и другие способы, но этот наиболее прост, в том случае, если вы точно знаете, какой узел вам требуется.

CComBSTR bstrSS(L"xmldata/xmlnode");

CComPtr<IXMLDOMNode> spXMLNode;

hr = spXMLDOM->selectSingleNode(bstrSS, &spXMLNode);

if (FAILED(hr)) throw "Unable to locate 'xmlnode' XML node";

if (spXMLNode.p == NULL) throw "Unable to locate 'xmlnode' XML node";

Другие методы, о которых вам следует знать, – это IXMLDOMDocument::nodeFromID и IXMLDOMElement::getElementsByTagName, которые вы можете использовать, чтобы получить список узлов в документе. Вы также можете обратиться к документу как к дереву и просканировать его (получая дочерний узел, все узлы одного уровня и т. д.).

В любом случае, результатом поиска станет объект узла MSXML, IXMLDOMNode. Узел должен существовать где-то в документе, иначе поиск закончится неудачей. Моё приложение использует его как родителя для совершенно нового узла, который создаётся объектом XML-документа:

CComPtr<IXMLDOMNode> spXMLChildNode;

hr = spXMLDOM->createNode(CComVariant(NODE_ELEMENT), CComBSTR("xmlchildnode"), NULL, &spXMLChildNode);

if (FAILED(hr)) throw "Unable to create 'xmlchildnode' XML node";

if (spXMLChildNode.p == NULL) throw "Unable to create 'xmlchildnode' XML node";

Если парсеру удалось создать новый узел, следующий шаг – разместить его в дереве XML. Метод IXMLDOMNode::appendChild – как раз то, что нам нужно.

CComPtr<IXMLDOMNode> spInsertedNode;

hr = spXMLNode->appendChild(spXMLChildNode, &spInsertedNode);

if (FAILED(hr)) throw "Unable to move 'xmlchildnode' XML node";

if (spInsertedNode.p == NULL) throw "Unable to move 'xmlchildnode' XML node";

Если родительский узел принял только что созданный узел в качестве дочернего, он вернёт вам ещё один экземпляр IXMLDOMNode, который представляет новый узел. На самом деле, этот новый узел и узел, который вы передали в appendChild, в точности совпадают. Тем не менее, проверка указателя на добавленный дочерний узел может быть полезной, так как в случае ошибки он примет значение NULL.

Итак, мы уже нашли требуемый узел и добавили к нему дочерний узел; теперь посмотрим, как работать с атрибутами. Представьте себе, что вам нужно добавить к новому дочернему узлу атрибут:

xml="fun"

Сделать это не сложно, но вам придётся переключиться с IXMLDOMNode на IXMLDOMElement, чтобы поработать с узлом как с элементом. На практике это означает, что вам придётся запросить у интерфейса IXMLDOMNode связанный с ним интерфейс IXMLDOMElement, а потом, получив его, вызвать IXMLDOMElement::setAttribute:

CComQIPtr<IXMLDOMElement> spXMLChildElement;

spXMLChildElement = spInsertedNode;

if (spXMLChildElement.p == NULL)

 throw "Unable to query for 'xmlchildnode' XML element interface";

hr = spXMLChildElement->setAttribute(CComBSTR(L"xml"), CComVariant(L"fun"));

if (FAILED(hr)) throw "Unable to insert new attribute";

Ну вот, мы модифицировали исходное XML-дерево, как нам этого хотелось. Приложение уже может сохранить документ на диск, но может сделать и что-нибудь ещё. Например, разыскать ещё один узел и отобразить на экране содержащийся в нём текст. Поскольку искать узлы мы уже умеем, перейдём прямо к извлечению данных.

Для извлечение данных предназначен метод IXMLDOMNode::get_nodeTypedValue. Данные, которые содержит узел, можно задавать с использованием схемы типов фирмы Microsoft, поэтому вы без труда можете сохранять числа с плавающей точкой, целые числа, строки или любые другие поддерживаемые схемой данные. Тип данных задаётся с использованием атрибута dt:type, например:

<model dt:type="string">SL-2</model>

<year dt:type="int">1992</year>

  • Читать дальше
  • 1
  • ...
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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