Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在HTML解析中,使用IHTMLDOMAttribute获取Cpp中标记的属性_C++_Html_Html Parsing_Mshtml_Microsoft.mshtml - Fatal编程技术网

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