Уроки Коммент.

Создание игр » Toolset » MSXML

MSXML

MSXMLMicrosoft XML Core Services (MSXML) это набор служб, который позволяет приложениям, написанным в различных средствах разработки Microsoft строить приложения для Windows, основанные на XML. Парсер MSXML основывается на объектной модели документа XML (XML Document Object Model, XML DOM), поэтому нужно в первую очередь вести речь о различных объектах, связанных с документом. Эти объекты позаимствованы прямо из спецификаций XML. MSXML имеет дополнительные удобства для стыковки объектов XML DOM с моделью COM. Благодаря этому, например, достаточно просто установить, какому объекту модели XML DOM соответствует тот или иной COM-интерфейс MSXML. Например, IXMLDOMNode представляет DOM-объект Node (узел).

Этот набор (Microsoft XML Core Services) поддерживает:

  • XML 1.0,
  • DOM,
  • SAX,
  • процессор XSLT 1.0,
  • XML Schema, включая XSD и XDR,
  • другие технологии XML.

Я сам MSXML не использую – не нравится он мне, да и не вижу особого смысла. Но вам расскажу – вдруг кому-то понравится и Вы станете использовать MSXML вместо других библиотек для работы с XML…

XML DOM

Модель XML DOM позволяет читать, обрабатывать и изменять XML-документ программным образом. DOM (от англ. Document Object Model – “объектная модель документа”) — это независимый от платформы и языка программный интерфейс, который позволяет программам получать доступ к содержимому HTML, XHTML и XML-документов, а также изменять их содержимое, структуру и оформление. MSXML как раз является одной из библиотек, позволяющий получить доступ к XML-данным посредством XML DOM.

XML-файл

Давайте напишем простой XML-файл с какими-то данными, которые мы в дальнейшем попробуем получить из этого файла с помощью MSXML. Например, сделаем вот такой XML:

<?xml version="1.0"?>
<xmldata>
   <xmlnode>XML,MSXML, data
      <xmlchildnode xml="fun" />
   </xmlnode>
   <xmltext>Hello from MSXML!</xmltext>
</xmldata>

Открываем XML-файл с помощью MSXML

В качестве примера работы с помощью MSXML давайте напишем несложное консольное приложение, которое просто откроет XML-файл и прочитает из него какие-то данные. Поиск узла в MSXML осуществляется через объект документа, поэтому мы будем использовать IXMLDOMDocument::selectSingleNode() для обнаружения нужного узла по его имени – это, наверное, самый простой способ получить XML-ноду из документа:

// инициализация COM
CoInitialize(NULL);
 
// создаём XML-парсер
CComPtr<IXMLDOMDocument> spXMLDOM;
HRESULT hr = spXMLDOM.CoCreateInstance(__uuidof(DOMDocument));
 
if ( FAILED(hr) )
	throw "Unable to create XML parser object";
if ( spXMLDOM.p == NULL )
	throw "Unable to create XML parser object";
 
// загружаем XML-документ
VARIANT_BOOL bSuccess = false;
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";
 
// ищем XML-ноду
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";

Вам так же могут пригодиться такие методы MSXML как IXMLDOMDocument::nodeFromID() и IXMLDOMElement::getElementsByTagName() – Вы можете использовать их для того, чтобы получить список узлов в документе по идентификатору либо по тегу. Кроме того, сколько XML-документ является деревом, хранящим данные, MSXML также позволяет Вам работать с документом как к деревом (получать дочерние узлы XML-ноды, все XML-узлы одного уровня и т. д.).

MSXML и чтение данных XML

Прочитать данные из XML-ноды с помощью MSXML ещё проще, чем прочитать сам XML-файл, вот исходник:

CComVariant varValue(VT_EMPTY); // сюда будем читать
hr = spXMLNode->get_nodeTypedValue(&varValue); // читаем
if ( FAILED(hr) ) // нет ошибки?
	throw "Unable to retrieve 'xmltext' text";
 
if ( varValue.vt == VT_BSTR ) // там строка?
{
	// конвертируем полученную строку из BSTR в ANSI
	USES_CONVERSION;
	LPTSTR lpstrMsg = W2T(varValue.bstrVal);
	std::cout << lpstrMsg << std::endl;
}
else
{
	// произошла ошибка
	throw "Unable to retrieve 'xmltext' text";
}

MSXML и добавление данных в XML

Добавление данных в XML при помощи MSXML так же не является слишком уж сложно для программиста задачей. Иначе говоря, с этим справится и ребёнок:

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 DOM не достаточно, надо ещё “прицепить” их в какой-либо XML-ноде, например, вот так:

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";

MSXML – запись XML в файл

Что бы сохранить XML-документ с внесёнными нами изменениями на диск, вполне хватит трёх строк кода:

hr = spXMLDOM->save(CComVariant("updatedxml.xml"));
if ( FAILED(hr) )
   throw "Unable to save updated XML document";

Надеюсь, кому-то этот урок по MSXML будет полезен и поможет разобраться с тем, как работать с XML-файлами. Дополнительно можно почитать о работе DOM XML в .NET.

Ещё по этой теме:




Раздел: Toolset · Теги: XML

Оставить комментарий

*

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>