При разборе HTML получить атрибуты тега в Cpp с помощью IHTMLDOMAttribute

пожалуйста помогите я делаю разбор html используя MSHTML, Мой код для получения всех атрибутов определенного тега выглядит следующим образом

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;
}

3

Решение

Если вы работаете в управляемой (CLI) VC ++, то вы можете рассмотреть HTML Agility Pack, доступно через Nuget.

Если придерживаться MSHTML не нужно, то, вероятно, вы можете выбрать синтаксический анализ документов HTML как документов XML. Таким образом, вы сможете анализировать все теги и атрибуты с большой гибкостью. Существует множество синтаксических анализаторов XML для C ++.

Эта библиотека выглядит компактно, просто и эффективно (доступно для нескольких платформ): https://github.com/leethomason/tinyxml2

Еще один: http://pugixml.org/

Эта ссылка может помочь вам, если вы хотите избавиться от зависимости MSHTML: http://www.codeproject.com/Articles/30342/Remove-Microsoft-mshtml-dependency

3

Другие решения

Вы действительно заботитесь о флаге указанного? Вы сказали, что хотите обработать все атрибуты, я думаю, что в этом случае вам не нужно заботиться об указанном флаге, просто обработайте все атрибуты.

Другое дело, если бы я был на вашем месте, я бы использовал CComPtr вместо всех открытых указателей com.

3

Я никогда не работал с этим раньше, но в соответствии с библиотеками документов и спецификаций DOM, кажется, что get_nodeValue() делает разные вещи в зависимости от типа «объекта узла». Попробуйте позвонить get_nodeValue() или же get_nodeName() на IHTMLDOMNode объект. Кажется очевидным, что некоторые свойства, такие как «value», «ID» и «Name», не являются частью коллекции атрибутов в DOM.


Документы MSHTML:

DOM spec:

2

проверьте тип ввода, затем запросите IID_IHTMLInputElement интерфейс, затем используйте get_value,

2
По вопросам рекламы [email protected]