C++ 在HTML解析中,使用IHTMLDOMAttribute获取Cpp中标记的属性
请帮助我使用C++ 在HTML解析中,使用IHTMLDOMAttribute获取Cpp中标记的属性,c++,html,html-parsing,mshtml,microsoft.mshtml,C++,Html,Html Parsing,Mshtml,Microsoft.mshtml,请帮助我使用MSHTML进行html解析。我获取特定标记的所有属性的代码如下 void GetAttributes(MSHTML::IHTMLElementPtr pColumnInnerElement) { IHTMLDOMNode *pElemDN = NULL; LONG lACLength; MSHTML::IHTMLAttributeCollection *pAttrColl; IDispatch* pACDisp; VARIANT vACInd
MSHTML
进行html解析。我获取特定标记的所有属性的代码如下
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();
}
}
知道为什么吗?还有哪些其他属性可能存在此问题
注
我试过了。它显示值的正确属性结果
if (strcmp(_com_util::ConvertBSTRToString(bstrName), "value") == 0)
{
cout<<_com_util::ConvertBSTRToString(bstrName)<<" :"<<_com_util::ConvertBSTRToString(vValue.bstrVal)<<endl;
}
if(strcmp(\u com\u util::convertbstrotstring(bstrName),“value”)==0)
{
cout我以前从未使用过它,但根据库文档和DOM规范,似乎get\u nodeValue()
根据“节点对象”的类型执行不同的操作。请尝试调用get\u nodeValue()
或get\u nodeName()
在IHTMLDOMNode
对象上。很明显,一些属性(如“value”、“ID”和“Name”)不属于DOM下的属性集合
MSHTML文档:
DOM规范:
您真的关心指定的标志吗?您说过要处理所有属性,我认为如果是这种情况,您不需要关心指定的标志,只需处理所有属性即可
<>另一件事是,如果我是你,我将使用CCOPTR来代替所有裸露的COM指针。 < P>如果你在托管(CLI)VC++中工作,那么你可以考虑通过NuGET。
如果不需要粘贴MSHTML,那么你可以选择将HTML文档解析为XML文档。这样你就可以灵活地分析所有的标签和属性。C++中有很多XML解析器。
此库看起来紧凑、简单且高效(可用于多种平台):https://github.com/leethomason/tinyxml2
另一个是:http://pugixml.org/
如果您想摆脱MSHTML依赖关系,此链接可能会对您有所帮助:检查输入类型,然后查询IID\u IHTMLInputElement
界面,然后使用get\u value
您的注释是什么意思?这是由于vb指定的测试吗?我添加了注释以显示vValue.bstrVal中正确的值。但仍然指定了vb无法确定指定的标志是否始终有意义。是否尝试更改文档兼容模式()。例如,当IE处于IE9“标准模式”时,specified始终为TRUE。@SimonMourier我想解析html文档中的每个标记和每个属性。是否有其他方法使用cpp。我已经使用MSHTML启动了html解析。任何建议都会很有帮助。我的网页处于IE-8兼容模式。我没有发现任何文档提到这一点关于指定get_的信息类型。对于输入类型文本,get_specified从属性类型返回false。但它对输入类型Button有效,请耐心等待。实际get_nodeName()在我的例子中返回标记名ie输入,而不是属性名。我在代码中检查了几乎所有IHTMLDOMNode的接口。问题也不在接口函数get_nodeValue()中.从我的笔记中可以清楚地看出,此函数返回正确的值,但指定的get_返回false,即使它在标记中指定。对不起,我一定误解了这个问题(以前从未使用过此库)这两个文档都在我的回答中列出了指定的标志应该是value属性的。这是一个旧的MS库,它可能有bug。我建议切换到一个更通用的XML解析引擎,比如在他的回答中建议的CPZ。我不太熟悉VisualStudio和其他高级C++术语,比如CComPtr。我不知道标签中有哪些属性。所以如果我使用get_nodeValue()不检查指定的标志,它会返回空指针,有时甚至是坏指针。感谢您的时间和回答。是的,我知道还有很多其他解析器。在等待2-3天,没有回复后,我选择了另一个so线程中提到的另一个HTML解析器
if (strcmp(_com_util::ConvertBSTRToString(bstrName), "value") == 0)
{
cout<<_com_util::ConvertBSTRToString(bstrName)<<" :"<<_com_util::ConvertBSTRToString(vValue.bstrVal)<<endl;
}