Kak получить список childNodes ?
От: Аноним  
Дата: 14.09.04 21:00
Оценка:
<root>
<param name="AA" type="int">
<constraint type="range">
</constraint>
</param>
<param name="BB" type= "string">
<constraint type="oneof">
</constraint>
<constraint type="oneof">
</constraint>
</param>
</root>

Есть XML(вверху) и есть код(внизу):

[из org.w3c.dom]

Node root = doc.getFirstChild();
NodeList params = root.getChildNodes();
int g = params.getLength();

Внимание! почему g = 5 ???? а не 2 ??? и как вернуть список нодов <param> ?
Re: Kak получить список childNodes ?
От: atrofa Украина  
Дата: 15.09.04 06:58
Оценка:
Здравствуйте, Аноним, Вы писали:

А><root>

А> <param name="AA" type="int">
А> <constraint type="range">
А> </constraint>
А> </param>
А> <param name="BB" type= "string">
А> <constraint type="oneof">
А> </constraint>
А> <constraint type="oneof">
А> </constraint>
А> </param>
А></root>

А>Есть XML(вверху) и есть код(внизу):


А>[из org.w3c.dom]


А>Node root = doc.getFirstChild();

А>NodeList params = root.getChildNodes();
А>int g = params.getLength();


CComPtr<IXMLDOMDocument> spXMLDom = NULL;
CComPtr<IXMLDOMElement> psElement = NULL;

VARIANT_BOOL bResult;

spXMLDom.CoCreateInstance(__uuidof(DOMDocument));
spXMLDom->load(CComVariant(L"test.xml"), &bResult);

spXMLDom->selectNodes(CComBSTR(L"//param"),&spNodesList);
long nLenNodeList;
spNodesList->get_length(&nLenNodeList);
вроде так...
Re[2]: А у меня в ДНК ошибка ...
От: Ларик Россия  
Дата: 15.09.04 08:52
Оценка:
или я документ как-то не правильно гружу ?

MSXML2::IXMLDOMDocument2* document = NULL;
MSXML2::IXMLDOMParseError* parseError = NULL;
MSXML2::IXMLDOMNodeList* rootlist = NULL;
MSXML2::IXMLDOMElement* element = NULL;    

hr = CoInitialize(NULL);    if (FAILED(hr)) {return FALSE;}

hr = CoCreateInstance(MSXML2::CLSID_DOMDocument, NULL,
        CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, 
        MSXML2::IID_IXMLDOMDocument2, (LPVOID*)&document);

if (!document) {return FALSE;}

    document->put_async(VARIANT_FALSE);
    bstr = strPathName.AllocSysString();
    VARIANT_BOOL varOkay = document->load(bstr);
    SysFreeString(bstr);

document->setProperty("SelectionLanguage", "XPath"); // не помогает :(

if (varOkay) {
    hr = document->get_documentElement(&element);
if (FAILED(hr) || element == NULL) {return FALSE;}
    element->get_nodeName(&nodeName);


rootlist=document->selectNodes(L"//param"); // здесь что только не вводил
rootlist->get_length(&Lcount); // а здесь всегда 0

Программа чужая, срочно в ней разбираюсь, нужно кое-что поправить, но вот этот момент поставил меня в полный тупик.
Самая большая в мире ложь — "Я прочел и согласен с условиями пользовательского соглашения".
Re[3]: А у меня в ДНК ошибка ...
От: ssm Россия  
Дата: 15.09.04 09:19
Оценка: 2 (1)
Здравствуйте, Ларик, Вы писали:


тебе повезло что оно вообще хоть что-то возвращает

CComPtr<MSXML2::IXMLDOMNodeList> rootlist;

HRESULT hr = document->selectNodes(L"//param", &rootlist);
ATLASSERT(SUCCEEDED(hr));

if(SUCCEEDED(hr) && rootlist)
{
   hr = rootlist->get_length(&Lcount);
}
Re[4]: пошел читать про COM ...
От: Ларик Россия  
Дата: 15.09.04 09:45
Оценка:
Здравствуйте, ssm, Вы писали:

ssm>
ssm>CComPtr<MSXML2::IXMLDOMNodeList> rootlist;

catchDoc.cpp(124) : error C2065: 'CComPtr' : undeclared identifier

ssm>


совсем запутался
Самая большая в мире ложь — "Я прочел и согласен с условиями пользовательского соглашения".
Re[5]: пошел читать про COM ...
От: ssm Россия  
Дата: 15.09.04 09:57
Оценка:
Здравствуйте, Ларик, Вы писали:


Л>совсем запутался


#include <ATLCOMCLI.H>
Re[5]: заработало !!! , правда...
От: Ларик Россия  
Дата: 15.09.04 10:00
Оценка:
я не понял в чем глубокая разница между

MSXML2::IXMLDOMNodeList* rootlist = NULL; // так не работало
и
CComPtr<MSXML2::IXMLDOMNodeList> rootlist2; // а так заработало


но, это так, для домашнего чтения, огромное спасибо за помошь
Самая большая в мире ложь — "Я прочел и согласен с условиями пользовательского соглашения".
Re[6]: заработало !!! , правда...
От: ssm Россия  
Дата: 15.09.04 10:17
Оценка:
Здравствуйте, Ларик, Вы писали:

MSXML2::IXMLDOMNodeList это голый интерфейс, а CComPtr<MSXML2::IXMLDOMNodeList> smart pointer, который облегчает программирование COM.
Проблема у тебя была в другом, если ты еще не понял:

document->selectNodes(L"//param") возвращает HRESULT, который у тебя приводился к указателю на MSXML2::IXMLDOMNodeList. Сам же лист должен передаваться в selectNodes как параметр, и в нем создаваться, твоя же задача его прибивать, что и делает CComPtr<> при выходе из области видимости
Re[7]: так в том то и дело ...
От: Ларик Россия  
Дата: 15.09.04 10:33
Оценка:
что у меня он не туда куда-то идет, т.е. step-by-step я попадаю в

inline IXMLDOMNodeListPtr IXMLDOMNode::selectNodes ( _bstr_t queryString ) {
    struct IXMLDOMNodeList * _result;
    HRESULT _hr = raw_selectNodes(queryString, &_result);
    if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
    return IXMLDOMNodeListPtr(_result, false);
}


т.е функция возращает лист, а не результат
а если я пишу

HRESULT hr = document->selectNodes(L"//param", &rootlist);

то компилятор пишет:
error C2660: 'selectNodes' : function does not take 2 parameters
Самая большая в мире ложь — "Я прочел и согласен с условиями пользовательского соглашения".
Re[8]: так в том то и дело ...
От: ssm Россия  
Дата: 15.09.04 10:44
Оценка:
Здравствуйте, Ларик, Вы писали:


Л>error C2660: 'selectNodes' : function does not take 2 parameters


а ну как проверь, у тебя
MSXML2::IXMLDOMDocument2* document;



или
MSXML2::IXMLDOMDocument2Ptr document;



тебе тогда вообще надо тогда так:
MSXML2::IXMLDOMDocument2Ptr document;
MSXML2::IXMLDOMNodeListPtr rootlist;
...
rootlist = document->selectNodes(L"//param");
Re[9]: так в том то и дело ...
От: Ларик Россия  
Дата: 15.09.04 11:12
Оценка:
Здравствуйте, ssm, Вы писали:

ssm>а ну как проверь, у тебя

ssm>
ssm>MSXML2::IXMLDOMDocument2* document;
ssm>


у меня вот так, а можно ламерский вопрос что це IXMLDOMDocument2Ptr, msdn как-то умолчал?
я просто недавно во все это залез, много сразу всего нового навалило, вот и приходится галопом по европам все это разбирать.
Самая большая в мире ложь — "Я прочел и согласен с условиями пользовательского соглашения".
Re[10]: так в том то и дело ...
От: ssm Россия  
Дата: 15.09.04 11:38
Оценка:
Здравствуйте, Ларик, Вы писали:



Л>у меня вот так, а можно ламерский вопрос что це IXMLDOMDocument2Ptr, msdn как-то умолчал?


синку, так тож заклятий вумний вказiвник оцю падлюку import генерить, щоб йому неладно...

Л>я просто недавно во все это залез, много сразу всего нового навалило, вот и приходится галопом по европам все это разбирать.



короче, делай так, а на досуге разберись и почитай о _com_ptr, import, CComPtr, COM:



hr = CoInitialize(NULL); 
if (FAILED(hr)) 
    return FALSE;
{
    try
    {
        MSXML2::IXMLDOMDocument2Ptr document(__uuidof(MSXML2::DOMDocument));
        document->put_async(VARIANT_FALSE);
        if(document->load("test.xml"))
        {
            MSXML2::IXMLDOMElementPtr element = document->GetdocumentElement();
            if(element)
            {
                MSXML2::IXMLDOMNodeListPtr rootlist = 
                    document->selectNodes(L"//param");
                for(long i = 0, length = rootList->Getlength(); i < length; ++i)    
                {
                    ::MessageBox(0, rootlist->Getitem(i)->Getxml(), TEXT(""), MB_OK);
                }
            }            
        }    
    catch (const _com_error &error)
    {
        ::MessageBox(0, error.ErrorMessage(), TEXT("Error"), MB_ICONERROR);
    }
}
CoUninitialize();
Re: Kak получить список childNodes ?
От: Аноним  
Дата: 15.09.04 19:57
Оценка:
А что-нибудь Java совместимое есть ?
Re: Kak получить список childNodes ?
От: Lloyd Россия  
Дата: 16.09.04 10:41
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Внимание! почему g = 5 ???? а не 2 ???


Ты посмотри тип этих нодов. Почти наверняка — текстовые. Порядковые номера — 1, 3, 5.

А>и как вернуть список нодов <param> ?


если по простому — просто передбрать и вернуть только нужные. если по-првильному — то использовать xpath.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.