Создание игр » Toolset » MSXML
MSXML
Microsoft 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-файлами. Дополнительно можно почитать о работе