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>>
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить