【问题标题】:QDomDocument get element by classQDomDocument 按类获取元素
【发布时间】:2013-12-19 16:00:05
【问题描述】:

我在一个 HTML 文件中有几个具有不同类的 div,如下所示:

<div class='A'>...</div>
<div class='B'>...</div>
<div class='C'>...</div>

我有一个 Qt (4.7) 程序,我需要能够根据类从中获取某个 div。我需要在这个程序中使用 QDomDocument。我从文档中知道该类有一个函数elementById(),但我不能让它与类一起工作,只是 ids。这不是一个制作的 HTML 文件或任何东西,所以我无法控制它是类还是 id。有没有办法做到这一点,我错过了?谢谢!

【问题讨论】:

    标签: html c++ qt qt4 qtxml


    【解决方案1】:

    看起来你需要这样的东西:

    main.cpp

    #include <QDomDocument>
    #include <QDomElement>
    #include <QDomNodeList>
    #include <QDomAttr>
    
    #include <QFile>
    #include <QDebug>
    
    int main()
    {
        QDomDocument doc("mydocument");
        QFile file("mydocument.xml");
        if (!file.open(QIODevice::ReadOnly))
            return 1;
    
        if (!doc.setContent(&file)) {
            file.close();
            return 1;
        }
        file.close();
    
        QDomNodeList divNodeList = doc.elementsByTagName("div");
    
        for (int i = 0; i < divNodeList.size(); ++i) {
            QDomElement domElement = divNodeList.at(i).toElement();
            QDomAttr attribute = domElement.attributeNode("class");
            qDebug() << "Attribute value" << attribute.value();
            if (attribute.value() == "A")
                qDebug() << "Found A";
        }
    
        return 0;
    }
    

    输出

    g++ -Wall -fPIC -I/usr/include/qt -I/usr/include/qt/QtCore -I/usr/include/qt/QtXml -lQt5Xml -lQt5Core main.cpp && ./a.out

    【讨论】:

    • 这可能是一个愚蠢的问题,但这是否适用于常规 HTML 或仅适用于 XML?我有一些与此非常相似的东西,但 divNodeList 的大小返回为 0。
    • @thnkwthprtls:是的,“QDomDocument 类代表一个 XML 文档。”。对于 html,你最好选择 QtWebkit 或 QtWebEngine。
    • 这可以解释为什么它让我如此困难-_- 我会尝试这种方式,谢谢!另外,我仍然会将其标记为已解决,因为我只是快速创建了一个 XML 文件并对其进行了测试,它可以工作,我会留给遇到类似问题的任何人。
    • 你认为为 qwebkit 提出这样一个全新的问题值得吗?自从我尝试切换后,我真的有点困惑
    • @thnkwthprtls:是的,我会打开一个新线程。不过,恐怕我无法提供帮助。
    【解决方案2】:

    首先尝试获取 div 元素,方法是:

    QDomDocument l_doc;
    l_doc.setContent( "here goes your html" );
    QDomNodeList l_divs( l_doc.elementsByTagName( "div" ) );
    

    然后你可以用这个来检索属性值:

    for ( int i = 0 ; i < l_divs.size() ; ++i ) {
        QDomElement l_div( l_divs.at( i ).toElement() );
        QString l_class( l_div.attribute( "class" ) );
        qDebug() << "class attribute:" << l_class;
    }
    

    我建议您重新考虑使用 QDomDocument 并尝试使用 QWebView 和 QWebElement。有了这些类,您就可以使用 CSS 选择器,这将使这个(和其他)任务变得更加容易。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-14
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多