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

    三、实现效果图

      

  • 相关阅读:
    [转]C# ReportViewer报表 详解
    [转]Java NIO原理图文分析及代码实现
    [转]C#泛型编程
    [转]ASP.NET页面基本对象
    [转]C#中抽象类和接口的异同
    [转]Android进程间通信消息机制及IPC机制实现
    [转]左连接和右连接的区别
    [转]C# 4.0 新特性
    [转]UML类图java代码实现
    [转]Using The Entity Framework With WCF
  • 原文地址:https://www.cnblogs.com/jiangson/p/11578427.html
Copyright © 2020-2023  润新知