Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.17.6.75] |
|
Сообщ.
#1
,
|
|
|
У UncleBob нашел отличный пример, основные моменты по нему ясны.
CComBSTR bstrCode = _T("<html><body><H1>Hello world!</H1></body></html>"); CComPtr <IHTMLDocument2> pIHTMLDocument2; if (S_OK == pIHTMLDocument2.CoCreateInstance (CLSID_HTMLDocument)) { LPSAFEARRAY psa = ::SafeArrayCreateVector (VT_VARIANT, 0, 1); if (psa) { VARIANT *pv; if (S_OK == ::SafeArrayAccessData (psa, (LPVOID*)&pv)) { pv->vt = VT_BSTR; pv->bstrVal = bstrCode; ::SafeArrayUnaccessData (psa); if (S_OK == pIHTMLDocument2->write (psa)) { CComPtr <IHTMLElementCollection> pIHTMLElementCollection; if (S_OK == pIHTMLDocument2->get_all (&pIHTMLElementCollection)) { CComPtr <IUnknown> pIUnknownEnum; if (S_OK == pIHTMLElementCollection->get__newEnum (&pIUnknownEnum)) { CComQIPtr <IEnumVARIANT> pIEnumVARIANT = pIUnknownEnum; if (pIEnumVARIANT) { pIEnumVARIANT->Reset(); VARIANT var; while (S_OK == pIEnumVARIANT->Next (1, &var, NULL)) { if (var.vt == VT_DISPATCH) { CComQIPtr <IHTMLElement> pIHTMLElement = var.pdispVal; if (pIHTMLElement) { CComBSTR bstrTag; pIHTMLElement->get_tagName (&bstrTag); BSTR bszHTML = NULL; pIHTMLElement->get_innerHTML(&bszHTML); BSTR bszTEXT = NULL; pIHTMLElement->get_innerText(&bszTEXT); } } ::VariantClear (&var); } } } } } } ::SafeArrayDestroy (psa); } } Проблема вот в чем, при переборе в цикле выводятся все элементы и получаем следующее: <html><body><H1>Hello world!</H1></body></html> <body><H1>Hello world!</H1></body> <H1>Hello world!</H1> Hello world! Вообще мне нужно получить только конечный текст, ну и параллельно знать путь к нему (к pIHTMLElement), т.е. кто стоит выше, и количество детей у этого элемента. Можно пропарсить руками, но мне хочется нормально сделать, наверняка есть методы встроенные. |
Сообщ.
#2
,
|
|
|
Сделал через get_sourceIndex(). Записываю указатели на все элементы в массив, потом при необходимости высчитываю всех родителей.
|