Qt处理xml文件

Qt处理xml文件

注意:

①项目的pro文件
QT +=core gui\
    xml       //这里要加上xml
②包含头文件
#include <QtXml/QDomNode>

如果头文件只是#include ,执行构建步骤的时候会报错 error: QtXml: No such file or directory

如果在pro文件中没有加上xml,会报出大量的错误。

③关于构建和重新构建

以下是在网上看到的

qmake,根据实际环境创建项 目文件.pro   并且运行qmake生成适当的Makefile
构建:构建是增量编译,只编译有变化部分
重新构建:    是把所有部分都重新编译
运行: 有改动则根据已有的Makefile进行编译,执行
构建和重新构建时如果没有Makefile,会根据.pro文件等生成Makefile后再编译

所以,有时候自己删除了pro中的一点东西,构建之后发现并没有报错,其实是因为增量编译。错误还是在里面的。

直接上代码

dialog.h

#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QLineEdit>
#include <QGridLayout>
#include <QMessageBox>
#include <QtXml/QDomNode>
#include <QTextBrowser>
#include <QDebug>
#include <QDialog>

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = 0);
    QList<QString> namelist;//建立一个list存储从xml文件中读取到的标签名字
    ~Dialog();

private:
    QPushButton *fileBtn;
    QLineEdit *fileLineEdit;
    QTextBrowser *textBrowser;
    QGridLayout *mainLayout;
    void parse(QString file_name);
private slots:
    void showfile();
};

#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include <QGridLayout>
#include <QFileDialog>
#include <QPushButton>

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    setWindowTitle(tr("xml查错工具"));
    fileBtn=new QPushButton;
    fileBtn->setText(tr("打开xml文件夹"));
    fileLineEdit=new QLineEdit;
    textBrowser=new QTextBrowser;
    textBrowser->setText("标签名");
    mainLayout=new QGridLayout(this);
    mainLayout->addWidget(fileBtn,0,0);
    mainLayout->addWidget(fileLineEdit,0,1);
    mainLayout->addWidget(textBrowser,1,0);
    connect(fileBtn,SIGNAL(clicked()),this,SLOT(showfile()));
}

Dialog::~Dialog()
{
}

void Dialog::showfile()
{
    namelist.clear();//每次调用此函数之前都将存储name的列表清空
    QString file_path = QFileDialog::getExistingDirectory(this,"请选择xml路径...","/");
    if(file_path.isEmpty())
    {
        return;
    }else{
            fileLineEdit->setText(file_path);
        }
    QDir filedir(file_path);
    filedir.setFilter(QDir::Files);
    QFileInfoList filelist=filedir.entryInfoList() ;
    int file_count=filelist.count();
    if(file_count <=0)
        return;
    QStringList string_list;
    for(int i=0;i<file_count;i++)
    {
        QFileInfo file_info = filelist.at(i);
        QString suffix = file_info.suffix();//匹配后缀名
        if(QString::compare(suffix, QString("xml"), Qt::CaseInsensitive) == 0)
                {
                    QString absolute_file_path = file_info.absoluteFilePath();
                    qDebug()<<"filename:"<<absolute_file_path;
                    parse(absolute_file_path);
                }
    }
    if(namelist.size()==0)
    {
        textBrowser->append("未找到name标签,你是不是文件夹错误?");
    }
    for ( int k=0; k!=namelist.size(); ++k )
    {
        textBrowser->append(namelist.at(k));
    }
    textBrowser->append("***********************************");
}


void Dialog::parse(QString file_name)
{
    //static QList<QString> namelist;//建立一个list存储从xml文件中读取到的标签名字
    if(file_name.isEmpty())
        return;
    qDebug()<<"parse_OK";
    QFile file(file_name);
    if(!file.open(QFile::ReadOnly | QFile::Text))
    {
        QMessageBox::information(NULL, QString("title"), QString("open error!"));
        return;
    }
    QDomDocument document;
    QString error;
    int row = 0, column = 0;
    if(!document.setContent(&file, false, &error, &row, &column))
    {
        QMessageBox::information(NULL, QString("title"), QString("parse file failed at line row and column") + QString::number(row, 10) + QString(",") + QString::number(column, 10));
        return;
    }
    file.close();

    if(document.isNull())
    {
        QMessageBox::information(NULL, QString("title"), QString("document is null!"));
        return;
    }

    QDomElement root = document.documentElement();

    //root_tag_name为annotation
    QString root_tag_name = root.tagName();
    qDebug()<<"root_name:"<<root_tag_name;
    if(root.hasAttribute("annotation"))
    {
        qDebug()<<"hasAttribute:annotation";
        //name为Qt
        QString name = root.attributeNode("name").value();
    }

    //
    QDomElement person = root.firstChildElement();
    if(person.isNull())
        return;

    QString person_tag_name = person.tagName();

    //获取子节点数目
    QDomNodeList list = root.childNodes();
    int count = list.count();
    qDebug()<<"子节点数目:"<<count;
    for(int i=0; i<count;i++)
    {
        QDomNode dom_node = list.item(i);
        QDomElement element = dom_node.toElement();
        if(element.tagName()=="object")
        {
            QDomNodeList child_list = element.childNodes();
            int child_count = child_list.count();
            for(int j=0; j<child_count;j++)
            {
                QDomNode child_dom_node = child_list.item(j);
                QDomElement child_element = child_dom_node.toElement();
                if(child_element.tagName()=="name")
                {
                    QString child_tag_name = child_element.tagName();
                    QString child_tag_value = child_element.text();
                    qDebug()<<"child_tag_name:"<<child_tag_value;
                    if(!namelist.contains(child_tag_value))
                    {
                        qDebug()<<"contains";
                        namelist<<child_tag_value;
                    }
                }
            }
        }
    }
}

好吧,写代码都是有套路的,现在就把这个套路整理下。

①先写头文件,规划一下布局界面中需要哪些控件,我们这个界面需要button,textedit,textbrower,gridlayout。所以在头文件中先声明。

    QPushButton *fileBtn;
    QLineEdit *fileLineEdit;
    QTextBrowser *textBrowser;
    QGridLayout *mainLayout;

②然后在cpp文件中完成布局分配。

    setWindowTitle(tr("xml查错工具"));//设置窗口的标题
    fileBtn=new QPushButton;//new一个按钮对象
    fileBtn->setText(tr("打开xml文件夹"));//设置按钮属性,也就是按钮上显示的字
    fileLineEdit=new QLineEdit;//new一个显示栏
    textBrowser=new QTextBrowser;//new一个大的显示栏
    textBrowser->setText("标签名");//大显示栏的第一行标题
    mainLayout=new QGridLayout(this);//new一个布局管理器
    mainLayout->addWidget(fileBtn,0,0);//将按钮放在第一行第一列的位置。这里0,0就是第一行第一列
    mainLayout->addWidget(fileLineEdit,0,1);//将小显示栏放在第一行第二列
    mainLayout->addWidget(textBrowser,1,0);//将大显示栏放在第二行第一列
    connect(fileBtn,SIGNAL(clicked()),this,SLOT(showfile()));//将按钮的点击信号与槽函数关联起来

③剩下的就是编写实现功能的逻辑代码了。槽函数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值