s'il vous plaît aidez-moi je fais une analyse html en utilisant MSHTML
. Mon code pour obtenir tous les attributs d'une balise particulière est comme ceDans l'analyse HTML Obtenir les attributs d'une étiquette dans Cpp en utilisant 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();
}
}
Le problème est pour la balise donnée <input id="Switch l_id2" class="pointer" name="Switch" onclick='SetControl("Switch l",1)' type="button" value="OK">
elle imprime tous les attributs sauf value
attribut. La fonction get_specified
renvoie false
pour l'attribut value
.
Ma sortie est
id :Switch l_id2
class :pointer
onclick :SetControl("Switch l",1)
type :button
name :Switch
Toute idée pourquoi? Aussi quels autres attributs peuvent avoir ce problème ??
Remarque
J'ai essayé de la sorte. Il montre les bons résultats d'attribut pour value
.
if (strcmp(_com_util::ConvertBSTRToString(bstrName), "value") == 0)
{
cout<<_com_util::ConvertBSTRToString(bstrName)<<" :"<<_com_util::ConvertBSTRToString(vValue.bstrVal)<<endl;
}
Que signifie votre note? Est-ce dû au test vbSpecified? –
J'ai ajouté Note pour afficher la valeur correcte dans vValue.bstrVal. Mais encore vbSpecified retourne false – 999k
Je ne suis pas sûr que le drapeau spécifié est toujours significatif. Avez-vous essayé de changer le mode de compatibilité de document (http://msdn.microsoft.com/en-us/library/cc288325.aspx). Par exemple, specified est toujours TRUE quand IE est en IE9 en mode 'Standards'. –