QT学习(XML)
XML的读写
XML和HTML区别:
XML: 可扩展标记语言
HTML:超文本标记语言
语法:
单标记
<标签名 属性名 = “属性值”/>
双标记
<标签名 属性名 = "属性值">
....
<标签名/>
HTML和XML区别:
1、xml标签和属性可自定义可扩展
html标签和属性不可以定义
2、xml注重在数据的本身作为数据承载一个标签的定义就是为了承载一个数据
html注重的是数据的显示方式 一个标签的使用为了页面的结构化和需求
XML读写的QT代码:
***.pro添加
QT += core gui xml
添加的头文件:
#include <QtXml>
#include<QFileDialog>
创建按钮writeBtn、readBtn;文本编辑器textEdit
(读取的TextRead.xml可以是自己提前写好或者利用本代码写)
按钮事件触发写入和读取:
//xml写入逻辑参考
void Widget::on_writeBtn_clicked()
{
QDomDocument doc;
QDomElement root = doc.createElement("root"); //文档对象创建一个标签
doc.appendChild(root);//root标签添加到文档对象
auto hero = doc.createElement("Hero");
root.appendChild(hero);
//为标签添加属性
hero.setAttribute("id" , "10086");
auto name = doc.createElement("Name");
auto desc = doc.createElement("Desc");
hero.appendChild(name);
hero.appendChild(desc);
name.appendChild(doc.createTextNode("阿珂"));
desc.appendChild(doc.createTextNode("刺客"));
QString fileNmae = QFileDialog::getSaveFileName(this,"保存xml");
QFile file(fileNmae);//文件对象
if(!file.open(QIODevice::WriteOnly))
{
return;
}
//保存文件
QTextStream outStream(&file);//使用文件对象 创建文本流对象
doc.save(outStream,4);
}
//读取测试
void Widget::on_readBtn_clicked()
{
QFile file("./TextRead.xml");//要读取的xml文件位置
if(!file.open(QIODevice::ReadOnly))
{
return;
}
QVector<Hero> vec;//数据承载容器
//进行xml数据解析
QDomDocument doc;
doc.setContent(&file);//设置xml文档内容为文件对象
auto root = doc.firstChildElement("root");//查找第一个子标签root
auto hero = root.firstChildElement("Hero");//从root标签找到第一个子标签Hero
while(!hero.isNull())
{
//进行标签解析
Hero heroInfo;
heroInfo.id = hero.attribute("id").toInt();
heroInfo.name = hero.firstChildElement("Name").text();
heroInfo.desc = hero.firstChildElement("Desc").text();
vec.append(heroInfo);
hero = hero.nextSiblingElement("Hero");//读取下一个标签
}
//显示到UI
QString contents = "";
for(Hero info : vec)
{
contents += "ID:" + QString::number(info.id);
contents += " Name:" + info.name;
contents += " Desc:" + info.desc;
contents += "\n--------------------------------\n";
}
ui->textEdit->setText(contents);
}