Qt处理xml文件

来源:互联网 发布:c语言scanf用法 编辑:程序博客网 时间:2024/05/23 01:59

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_OBJECTpublic:    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 0