Использование парсера MSXML для работы с XML-документами
От: Alexander Shargin Россия RSDN.ru
Дата: 28.08.01 00:10
Оценка: 141 (7)
Статья:
Kenn Scribner. Использование парсера MSXML для работы с XML-документами
Автор(ы): Кен Скрибнер (Kenn Scribner)
Дата: 17.04.2001

В этой статье автор на простом примере демонстрирует применение парсера MSXML для работы с XML-документами (загрузка и сохранение документа, поиск, изменение и добавление узлов, получение и изменение атрибутов). Для работы с MSXML используются средства библиотеки ATL.


Авторы:
Alexander Shargin

Аннотация:
В этой статье автор на простом примере демонстрирует применение парсера MSXML для работы с XML-документами (загрузка и сохранение документа, поиск, изменение и добавление узлов, получение и изменение атрибутов). Для работы с MSXML используются средства библиотеки ATL.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Демонстрационный проект XMLNodeExerciser
От: Аноним  
Дата: 29.08.01 00:10
Оценка:
Пример (как есть) — не компилируется.
Надо добавить в установках проекта
Additional include directories:
C:\Program Files\Microsoft XML Parser SDK\inc
и подключить заголовочный файл:
#include <msxml2.h> а не msxml.h
Другой путь — использовать:
#import <msxml4.dll>
using namespace MSXML2;
но тут надо будет исправлять код
(
hr = spXMLDOM->load(CComVariant(L"xmldata.xml"),&bSuccess);
на
varBool = docPtr->load( varFileName );
)
Нифига .... Все работает и компилится...
От: Аноним  
Дата: 04.09.01 16:19
Оценка:
Нифига .... Все работает и компилится... Нужно просто SDK иметь ... Я ничего не правил, все зашибись ...
2-ой способ
От: Safor Беларусь  
Дата: 24.01.02 02:40
Оценка:
1. в stdafx.h вместо
#include <msxml.h>
пишем
#import "msxml.dll" named_guids raw_interfaces_only
2. все обращения к интерфейсам XML парсера расширяем MSXML::
(например, вместо
CComPtr<IXMLDOMDocument> spXMLDOM;
записываем
CComPtr<MSXML::IXMLDOMDocument> spXMLDOM;
)
BUG ???
От: Tim Россия RSDN.ru
Дата: 12.02.02 02:27
Оценка:
> hr = spXMLDOM->selectSingleNode(bstrSS,&spXMLNode);
> if ( FAILED(hr) )
> throw "Unable to locate 'xmlnode' XML node";

Если узел не найден selectSingleNode вернет S_FALSE, поэтому
проверка if (FAILED(hr) не сработает.

Следует проверять либо hr==S_OK либо spXMLNode!=NULL
--
Как мы живем государственная тайна, на что — коммерческая, с кем — личная.
создание документа
От: asdfg  
Дата: 25.02.02 02:25
Оценка:
будут детально описаны основные интерфейсы и их методы.
Меня на данный момент интересует пример создание пустого документа сохранение туда таблиц
и потом восстановление этих таблиц.
Это когданибуть будет?
Наследование
От: 2  
Дата: 06.04.02 02:00
Оценка:
как пользоватся наследованием Проблемы возникаю при добавлении childs.
Например создаем класс

class XMLElement: public IXMLDOMElement
{


IXMLDOMElement* pXMLDOMElement;

Реализуем все методы подобно:
HRESULT __stdcall get_tagName (BSTR * tagName )
{return pXMLDOMElement->get_tagName (tagName);}
...................................
и так далее все кроме
HRESULT STDMETHODCALLTYPE QueryInterface( /* [in] */ REFIID riid,/* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
{return this-> QueryInterface( riid, ppvObject);};
};
То при попытке добовать ребенка:
XMLElement* pElement;
XMLElement* pElementPar;
IXMLDOMNode* outElement;
.......................
hr=pElementPar->appendChild(pElement,&outElement);
Запрашивается недокументированный интерфейс
{88D969D0-F192-11D4-A65F-0040963251E5}
Re: 2-ой способ
От: LeonidM  
Дата: 30.04.02 22:30
Оценка:
Possible to write
using namespace MSXML;
instead of "все обращения к интерфейсам XML парсера расширяем MSXML::"
IXMLDOMNode- symbol is ambiguous???
От: Турилин Александр Сергеевич  
Дата: 20.01.03 11:21
Оценка:
У меня почему-то ни в какую не хочет работать!
Ни этот вариант, ни тот, что в MSDN приведен через IXMLDocumentPtr!

Интересно, к чему бы это?

А пишет все время одно и то же — IXMLDOMNode — определен неоднозначно...
Re: IXMLDOMNode- symbol is ambiguous???
От: null  
Дата: 24.02.03 17:44
Оценка:
Такое сообщение возникает в VC7 (т.к. где-то в глубинах MFC7 используется директива "#include <msxml2.h>")
Чтобы этого избежать, надо просто указывать тип интерфейсног указателя (или smart-pointer'a) полностью: т.е. MSXML2::IXMLDOMNode или MSXML2::IXMLDOMNodePtr
Re: Демонстрационный проект XMLNodeExerciser
От: Sinva Канада  
Дата: 09.10.03 17:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Пример (как есть) — не компилируется.

А>Надо добавить в установках проекта
А> Additional include directories:
А> C:\Program Files\Microsoft XML Parser SDK\inc
А>и подключить заголовочный файл:
А>#include <msxml2.h> а не msxml.h
А>Другой путь — использовать:
А> #import <msxml4.dll>
А> using namespace MSXML2;
А>но тут надо будет исправлять код
А>(

Thanks a lot.
А>hr = spXMLDOM->load(CComVariant(L"xmldata.xml"),&bSuccess);
А>на
А>varBool = docPtr->load( varFileName );
А>)
Re: Использование парсера MSXML для работы с XML-документами
От: Kont Россия  
Дата: 10.11.03 11:31
Оценка:
Проблема такая! Взял этот пример, и скопировал к себе в проект, оформил как функцию.
Проект является WinAPI DLL. Все скопилилось. Только виснет програ

    try {
        // Create an instance of the parser
        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";


на жирной строке. Пример работает нормально! В чем грабли?
Я вот все чаще думаю:
Все великие люди уже умерли...
Вот и я себя плохо чувствую!
Re[2]: Использование парсера MSXML для работы с XML-документ
От: Kont Россия  
Дата: 10.11.03 14:22
Оценка:
В догонку:


Loaded 'C:\WINNT2K\system32\clbcatq.dll', no matching symbolic information found.
Loaded 'C:\WINNT2K\system32\msvcrt.dll', no matching symbolic information found.


Такое вот выдается в окне Debug когда програ повисает!
Я вот все чаще думаю:
Все великие люди уже умерли...
Вот и я себя плохо чувствую!
Re[2]: Использование парсера MSXML для работы с XML-документ
От: OlegO Россия http://www.mediachase.ru
Дата: 11.11.03 09:55
Оценка:
Здравствуйте, Kont, Вы писали:

K>Проблема такая! Взял этот пример, и скопировал к себе в проект, оформил как функцию.

K>Проект является WinAPI DLL. Все скопилилось. Только виснет програ

K>на жирной строке. Пример работает нормально! В чем грабли?


CoInitialize не забыл вызвать?
С уважением, OlegO.
Re[3]: Использование парсера MSXML для работы с XML-документ
От: Kont Россия  
Дата: 11.11.03 09:59
Оценка:
Здравствуйте, OlegO, Вы писали:

OO>Здравствуйте, Kont, Вы писали:


K>>Проблема такая! Взял этот пример, и скопировал к себе в проект, оформил как функцию.

K>>Проект является WinAPI DLL. Все скопилилось. Только виснет програ

K>>на жирной строке. Пример работает нормально! В чем грабли?


OO>CoInitialize не забыл вызвать?


Я скопировал весь код, без исключения, в свой проект. Соответственно и вызов CoInitialize!
Я вот все чаще думаю:
Все великие люди уже умерли...
Вот и я себя плохо чувствую!
Re[4]: Использование парсера MSXML для работы с XML-документ
От: OlegO Россия http://www.mediachase.ru
Дата: 11.11.03 10:28
Оценка:
Здравствуйте, Kont, Вы писали:

K>Я скопировал весь код, без исключения, в свой проект. Соответственно и вызов CoInitialize!


Тогда вопрос: Где идет создание объекта в DLL? В какой функции?
С уважением, OlegO.
Re[5]: Использование парсера MSXML для работы с XML-документ
От: Kont Россия  
Дата: 11.11.03 11:22
Оценка:
Здравствуйте, OlegO, Вы писали:

OO>Здравствуйте, Kont, Вы писали:


K>>Я скопировал весь код, без исключения, в свой проект. Соответственно и вызов CoInitialize!


OO>Тогда вопрос: Где идет создание объекта в DLL? В какой функции?


Находится это в методе класса. Класс создается локальной переменной. Затем вызывается метод с этим кодом. И все.
Я вот все чаще думаю:
Все великие люди уже умерли...
Вот и я себя плохо чувствую!
Re[6]: Использование парсера MSXML для работы с XML-документ
От: OlegO Россия http://www.mediachase.ru
Дата: 11.11.03 12:00
Оценка:
Здравствуйте, Kont, Вы писали:

OO>>Тогда вопрос: Где идет создание объекта в DLL? В какой функции?


K>Находится это в методе класса. Класс создается локальной переменной. Затем вызывается метод с этим кодом. И все.


Возможно не так выразился, Вызов твоего кода случайно идет не в рамках DllMain, если да то надо вынести в отдельную ф-ю, потому-что возможно следующие:

Warning  The entry-point function should perform only simple initialization or termination tasks. 
It must not call the [msdn]LoadLibrary[/msdn] or [msdn]LoadLibraryEx[/msdn] function 
(or a function that calls these functions), because this may create dependency loops in the 
DLL load order. This can result in a DLL being used before the system has executed its initialization code. 
Similarly, the entry-point function must not call the FreeLibrary function (or a function that calls FreeLibrary), 
because this can result in a DLL being used after the system has executed its termination code.
С уважением, OlegO.
Re[7]: Использование парсера MSXML для работы с XML-документ
От: Kont Россия  
Дата: 11.11.03 12:37
Оценка:
Здравствуйте, OlegO, Вы писали:

OO>Возможно не так выразился, Вызов твоего кода случайно идет не в рамках DllMain, если да то надо вынести в отдельную ф-ю, потому-что возможно следующие:


Вызов происходит в экспортируемой функции.
Я немного поэкспериментировал, и нашел особенность:
В этой функции создавались мои объекты и окна. Так вот оказалось, что вызов метода класса, работающего с COM, происходил после создания моих объектов и окон. Я перенес вызов в самое начало экспортируемой функции, в то место где еще ничего моего не создавалось, и все стало работать. Еще я вынес инициализацию/деинициализацию COM в конструктор/деструктор класса. А сам экземпляр класса обявляется глобально в DLL

    EP_FILE_N1 xmlFN1;


Кто объяснит мне? Безопасно ли потом будет работать с COM? Смогу ли я работать в своих объектах с COM, не подвешивая программу?
Я вот все чаще думаю:
Все великие люди уже умерли...
Вот и я себя плохо чувствую!
Re: Использование парсера MSXML для работы с XML-документами
От: Endymion  
Дата: 13.01.04 20:15
Оценка:
у меня проблема

я прочитал статью о Использование парсера MSXML для работы с XML-документами.
скопировал её. но у меня есть проблема с запуском.

// Create an instance of the parser
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

на первом же ифе программа заканчивается.
я не могу понять почему не получаетмся сделать инициализацию объекта.

PS
я скачал MSXML 4,0 и перенаправил прогу на её хедеры.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.