, пожалуйста, помогите, я делаю анализ html с использованием MSHTML
. Мой код для получения всех атрибутов конкретного тега как этогоВ анализе HTML Получить атрибуты тега в Cpp, используя IHTMLDOMAttribute
void GetAttributes(MSHTML::IHTMLElementPtr pColumnInnerElement)
{
IHTMLDOMNode *pElemDN = NULL;
LONG lACLength;
MSHTML::IHTMLAttributeCollection *pAttrColl;
IDispatch* pACDisp;
VARIANT vACIndex;
IDispatch* pItemDisp;
IHTMLDOMAttribute* pItem;
BSTR bstrName;
VARIANT vValue;
VARIANT_BOOL vbSpecified;
pColumnInnerElement->QueryInterface(IID_IHTMLDOMNode, (void**)&pElemDN);
if (pElemDN != NULL)
{
pElemDN->get_attributes(&pACDisp);
pACDisp->QueryInterface(IID_IHTMLAttributeCollection, (void**)&pAttrColl);
pAttrColl->get_length(&lACLength);
vACIndex.vt = VT_I4;
for (int i = 0; i < lACLength; i++)
{
vACIndex.lVal = i;
pItemDisp = pAttrColl->item(&vACIndex);
if (pItemDisp != NULL)
{
pItemDisp->QueryInterface(IID_IHTMLDOMAttribute, (void**)&pItem);
pItem->get_specified(&vbSpecified);
pItem->get_nodeName(&bstrName);
pItem->get_nodeValue(&vValue);
if (vbSpecified)
cout<<_com_util::ConvertBSTRToString(bstrName)<<" :"<<_com_util::ConvertBSTRToString(vValue.bstrVal)<<endl;
pItem->Release();
}
pItemDisp->Release();
}
pElemDN->Release();
pACDisp->Release();
pAttrColl->Release();
}
}
Проблемы для данного тега <input id="Switch l_id2" class="pointer" name="Switch" onclick='SetControl("Switch l",1)' type="button" value="OK">
печатает все атрибуты, кроме атрибута value
. Функция get_specified
возвращает false
для атрибута value
.
Мой выход
id :Switch l_id2
class :pointer
onclick :SetControl("Switch l",1)
type :button
name :Switch
Любая идея, почему? И какие другие атрибуты могут иметь эту проблему?
Примечание
Я пробовал вот так. Он показывает правильные результаты атрибутов для value
.
if (strcmp(_com_util::ConvertBSTRToString(bstrName), "value") == 0)
{
cout<<_com_util::ConvertBSTRToString(bstrName)<<" :"<<_com_util::ConvertBSTRToString(vValue.bstrVal)<<endl;
}
Что означает ваша заметка? Это связано с тестом vbSpecified? –
Я добавил примечание, чтобы показать правильное значение в vValue.bstrVal. Но все же vbSpecified возвращает false – 999k
Не уверен, что указанный флаг всегда имеет смысл. Вы пытались изменить режим совместимости документов (http://msdn.microsoft.com/en-us/library/cc288325.aspx). Например, указанный всегда имеет значение ИСТИНА, когда IE находится в IE9 «Режим стандартов». –