您的位置:首页 > 编程语言 > Qt开发

Qt处理xml文件

2017-01-08 14:10 323 查看

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()));//将按钮的点击信号与槽函数关联起来


③剩下的就是编写实现功能的逻辑代码了。槽函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: