msxml parser - НЕПОНИМАЮ!
От: svld  
Дата: 08.11.01 19:03
Оценка:
Есть XML-файл
<?xml version="1.0"?>
<root>
  <info>TEXT1</info>
  <info>TEXT2</info>
</root>

Есть код(основная часть)

#import <msxml3.dll> named_guids
using namespace MSXML2;

IXMLDOMNodePtr pChild;
IXMLDOMNodeListPtr pNodeList;

IXMLDOMNodePtr pDocRoot = m_plDomDocument->documentElement; //уже существует


    pChild = pParent->selectSingleNode(L"info"); // Все находится
        String str = (char*)pChild->nodeName;

    pNodeList = pParent->selectNodes(L"info"); 
    long num = pIDOMNodeList->Getlength(); // num=0 и хоть ты тресни

Такие же проблемы с getElementsByTagName(L"TEXT1")

Может кто знает что для полного счастья этой заразе надо.
Почему один метод работает, а второй нет?
Re: msxml parser - НЕПОНИМАЮ!
От: IT Россия linq2db.com
Дата: 08.11.01 19:25
Оценка:
Здравствуйте svld, Вы писали:

S>Может кто знает что для полного счастья этой заразе надо.

S>Почему один метод работает, а второй нет?

А так попробуй

pNodeList = pParent->selectNodes(L"root/info");
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: msxml parser - НЕПОНИМАЮ!
От: svld  
Дата: 09.11.01 10:29
Оценка:
Здравствуйте IT, Вы писали:

IT>А так попробуй


IT>
IT>pNodeList = pParent->selectNodes(L"root/info"); 
IT>


При таком подходе не работают оба метода

Может у кого-то есть рабочий примерчик с этими методами и тестовый XML.
Интересно проверить у себя. Подозреваю, что причина в какой-то ерунде.
Но в какой?
Re[3]: msxml parser - НЕПОНИМАЮ!
От: IT Россия linq2db.com
Дата: 09.11.01 15:40
Оценка:
Здравствуйте svld, Вы писали:

Вот тебе пример, который выводит две двойки:

#include "stdafx.h"
#include <iostream.h>
#import <msxml3.dll>

void main()
{
    ::CoInitialize(NULL);
    try {    
        using namespace MSXML2;
        IXMLDOMDocumentPtr doc(__uuidof(DOMDocument));
        doc->loadXML(
            L"<?xml version=\"1.0\"?>"
            L"<root>"
            L"<info>TEXT1</info>"
            L"<info>TEXT2</info>"
            L"</root>"
        );
    
        IXMLDOMElementPtr root = doc->selectSingleNode(L"root");
        IXMLDOMNodeListPtr node = root->selectNodes(L"info"); 
        long num = node->Getlength();
        cout 
            << num 
            << endl
            << doc->selectNodes(L"root/info")->Getlength()
            << endl;
    } catch (_com_error& er) {
        cout
            << er.ErrorMessage()
            << endl;
    } 
    ::CoUninitialize();
}
Если нам не помогут, то мы тоже никого не пощадим.
Re: msxml parser - НЕПОНИМАЮ!
От: Аноним  
Дата: 11.11.01 16:22
Оценка:
Здравствуйте svld, Вы писали:

S>Есть XML-файл

S>
S><?xml version="1.0"?>
S><root>
S>  <info>TEXT1</info>
S>  <info>TEXT2</info>
S></root> 
S>

S>Есть код(основная часть)

S>
S>#import <msxml3.dll> named_guids
S>using namespace MSXML2;

S>IXMLDOMNodePtr pChild;
S>IXMLDOMNodeListPtr pNodeList;

S>IXMLDOMNodePtr pDocRoot = m_plDomDocument->documentElement; //уже существует


S>    pChild = pParent->selectSingleNode(L"info"); // Все находится
S>        String str = (char*)pChild->nodeName;

S>    pNodeList = pParent->selectNodes(L"info"); 
S>    long num = pIDOMNodeList->Getlength(); // num=0 и хоть ты тресни
S>

S>Такие же проблемы с getElementsByTagName(L"TEXT1")

S>Может кто знает что для полного счастья этой заразе надо.

S>Почему один метод работает, а второй нет?




C/C++ Return Values
S_OK
Value returned if successful.
E_INVALIDARG
Value returned if resultList is Null.

Remarks
The selectSingleNode method is much like the selectNodes method but returns only the first matching node rather than the list of all matching nodes.

The IXMLDOMNodeList is live and immediately reflects changes to the nodes that appear in the list.
Re[4]: msxml parser - НЕПОНИМАЮ!
От: ZORK Россия www.zorkaltsev.com
Дата: 12.11.01 15:09
Оценка:
Здравствуйте IT, Вы писали:

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


IT>Вот тебе пример, который выводит две двойки:


IT>
IT>#include "stdafx.h"
IT>#include <iostream.h>
IT>#import <msxml3.dll>

IT>void main()
IT>{
IT>    ::CoInitialize(NULL);
IT>    try {    
IT>        using namespace MSXML2;
IT>        IXMLDOMDocumentPtr doc(__uuidof(DOMDocument));
IT>        doc->loadXML(
IT>            L"<?xml version=\"1.0\"?>"
IT>            L"<root>"
IT>            L"<info>TEXT1</info>"
IT>            L"<info>TEXT2</info>"
IT>            L"</root>"
IT>        );
IT>    
IT>        IXMLDOMElementPtr root = doc->selectSingleNode(L"root");
IT>        IXMLDOMNodeListPtr node = root->selectNodes(L"info"); 
IT>        long num = node->Getlength();
IT>        cout 
IT>            << num 
IT>            << endl
IT>            << doc->selectNodes(L"root/info")->Getlength()
IT>            << endl;
IT>    } catch (_com_error& er) {
IT>        cout
IT>            << er.ErrorMessage()
IT>            << endl;
IT>    } 
IT>    ::CoUninitialize();
IT>}
IT>


Насколько я знаю L"..." не является полноценным аналогом [b/]BSTR[/b], в частности для функции ::SysStringLen(), так что, использование L"..." в BSTR параметрах, является опастной практикой, так как оно может и не сработать. Другими словами, использование L"..." для BSTR параметров есть предположение о реализации объекта, что, я-б сказал, не правильно.

Или я не прав?

-Zork
Думать надо ...головой :)
Re[5]: msxml parser - НЕПОНИМАЮ!
От: ZORK Россия www.zorkaltsev.com
Дата: 12.11.01 15:11
Оценка:
Здравствуйте Все:

Отбой! — я догадался, что это импортированный интерфейс, с bstr_t как паратрами. Так что все нормально. Sorry — торможу!

-Zork
Думать надо ...головой :)
Re[6]: msxml parser - НЕПОНИМАЮ!
От: Snax Россия  
Дата: 21.11.01 08:20
Оценка:
Здравствуйте ZORK, Вы писали:

ZORK>Здравствуйте Все:


ZORK>Отбой! — я догадался, что это импортированный интерфейс, с bstr_t как паратрами. Так что все нормально. Sorry — торможу!



Нет, не тормозишь.
Могу заявить как краевед, что
doc->loadXML(L"<?xml version=\"1.0\"?><blablabla/>");

Будет работать, если doc есть указатель на inproc-server объект.
Дело в том, что в ненешней реализации XML'я от Майкрософт все эти методы
работают с BSTR'ами как с LPWSTR'ами.

А вот если мы имеем отмаршаленный интерфейс, то proxy/stub трактует
BSTR'ы как BSTR'ы и соответственно не работает.

Впрочем, на моей памяти маршалить XML'ный объект приходилось лиш единожды.
Обычно хватает пореслать сторку и распарсить на месте.

Павел.
Re[7]: msxml parser - НЕПОНИМАЮ!
От: ZORK Россия www.zorkaltsev.com
Дата: 21.11.01 08:44
Оценка:
Здравствуйте Snax, Вы писали:

S>А вот если мы имеем отмаршаленный интерфейс, то proxy/stub трактует

S>BSTR'ы как BSTR'ы и соответственно не работает.

Ну в данном случае, так как там сделанно #import без native все BSTR параметры в методах будут _bstr_t, так что L"...", будут сперва скопиранны в BSTR конструкторами _bstr_t, и только после этого переданны в COM объект, так что должно работать и с proxy.

-Zork
Думать надо ...головой :)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.