zoukankan      html  css  js  c++  java
  • Qt解析多级xml文件

    一、如下图为XML文件

      

       annotation为根节点, first第一节点,second第二节点,third第三节点。

    二、实现解析xml文件,并将解析数据用QTreeView显示,实现代码如下

      ① .h文件

    class ParamSettingDlg : public QDialog
    {
        Q_OBJECT
    
    public:
        explicit ParamSettingDlg(QWidget *parent = nullptr);
        ~ParamSettingDlg();
    
    private:
        Ui::ParamSettingDlg *ui;
    
        QStandardItemModel *model;
    };

      ② cpp文件

    void ParamSettingDlg::LoadClassifyFile()
    {
        QDomDocument doc;
        QString strXMLPath = QApplication::applicationDirPath() + + "/config/classify.xml";
    
        model = new QStandardItemModel(ui->treeView);
        model->setHorizontalHeaderLabels(QStringList()<<QStringLiteral("Classify"));
    
        QFile file(strXMLPath);
        if (!file.open(QIODevice::ReadOnly))
            return;
    
        QString strError;
        int iErrCount;
        int iErrLine;
        if ( !doc.setContent(&file, false, &strError, &iErrLine, &iErrCount) )
        {
            LoggerInfo::GetInstance()->WriteLog(LOG_LEVEL_ERROR,"Open XML Failed : " + strError ,__FUNCTION__,__LINE__);
            file.close();
            return ;
        }
    
        //! 根节点
        QDomElement root = doc.documentElement();
    
        //一级节点
        QDomElement firstNode = root.firstChildElement("first");
        for (; !firstNode.isNull(); firstNode = firstNode.nextSiblingElement("first"))
        {
            QList<QStandardItem*> firstItems;
            QStandardItem* item1 = new QStandardItem(firstNode.attribute("name"));
            firstItems.append(item1);
            model->appendRow(firstItems);
    
            ui->comboBox->addItem(item1->text());
    
            //二级节点
            QDomElement secondNode = firstNode.firstChildElement("second");
            for (; !secondNode.isNull(); secondNode = secondNode.nextSiblingElement("second"))
            {
                QList<QStandardItem*> secondItems;
                QStandardItem* item2 = new QStandardItem(secondNode.attribute("name"));
                secondItems.append(item2);
                item1->appendRow(secondItems);
    
                ui->comboBox->addItem(item2->text());
    
                //三级节点
                QDomElement thirdNode = secondNode.firstChildElement("third");
                for (; !thirdNode.isNull(); thirdNode = thirdNode.nextSiblingElement("third"))
                {
                    QList<QStandardItem*> thirdItems;
                    QStandardItem* item3 = new QStandardItem(thirdNode.attribute("name"));
                    thirdItems.append(item3);
                    item2->appendRow(thirdItems);
    
                    ui->comboBox->addItem(item3->text());
                }
            }
    
        }
    
        ui->treeView->setModel(model);
    }

    三、实现效果图

      

  • 相关阅读:
    基于centos的freeradius高可用lvs(UDP)
    sql server 2012的AlwaysOn高可用
    python基础题型一
    用户访一个APP或者网页流程示意图
    DNS解析流程
    crontab的定时任务实例
    Xcode设置
    Nvidia Nsight + .NET
    C++ Pointer-to-Member Selector
    C++11
  • 原文地址:https://www.cnblogs.com/jiangson/p/11578427.html
Copyright © 2011-2022 走看看