38初识xml
XML(可扩展标记语言)是一种用于记录多种数据类型的标记语言。使用XML可以将各类型的文档定义为容易读取的格式,便于用户读取。而且,在应用程序中使用XML,可以轻松实现数据交换。
QT中提供两种访问XML文档的方式:DOM和SAX。
DOM方式:将XML文档转换为树形结果存储到内存中,再进行读取,消耗的内存比较多。此外,由于文档都已经存储到内存,所以需要频繁实现修改等操作时,使用起来比较方便。
SAX方式:相比于DOM,SAX是一种速度更快,更有效的方法,它逐行扫描文档,一边扫描一边解析(由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中,这对于大型文档的解析是一个巨大优势。)而且相比于DOM,SAX可以在解析文档的任意时刻停止解析。但操作复杂,很难修改XML数据。
本例只介绍DOM
QT为DOM提供了用于操作XML的多种C++类,均以QDOM开头:
类 描述
QDomAttr, 表示一个QdomElement的属性
QDomCharacterData, 表示DOM中的一个通用字符串
QDomDocument, 表示XML文档
DomDocumentFragment, QDomNodes树,通常不是一个完整地QDomDocument
QDomDocumentType, 表示文档树中的DTD
QDomElement, 表示DOM树中的一个元素
QDomEntity, 代表一个XML实体
QDomEntityReference, 代表一个XML实体引用
QDomNode、 一个DOM树中所有节点的基类
QDomNodeList、 QdomNode对象列表
QDomNotation, 代表一个XML表示法
QDomProcessingInstruction. 代表XML指令
QDomText、 表示解析的XML文档中的文本数据
重点:在.pro添加QT+=xml
添加一个C++空文件,不需要继承任何基类。如下图:
创建空的XML文件
class DomXML
{
public:
DomXML();
static void CreateXML(QString strFilePath);
};
//创建空的xml文件
void DomXML::CreateXML(QString strFilePath)
{
//打开文件
QFile file(strFilePath);
if(file.exists())
{
qDebug()<<"FilePath exists";
return ;
}
else
{
bool bIsOk=file.open(QIODevice::WriteOnly);
if(bIsOk)
{//打开文件成功
//创建xml文档对象
QDomDocument doc;
//创建xml头部格式<?xml version="1.0" encoding="UTF-8"?>
QDomProcessingInstruction ins;
ins=doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
//追加元素
doc.appendChild(ins);
//根节点元素
QDomElement root=doc.createElement("日期销售清单");
doc.appendChild(root);
//保存
QTextStream stream(&file);//文本流关联文件
doc.save(stream,4); //4代表缩进4个字符
}
else
{//文件打开失败
qDebug()<<"open file error";
return ;
}
}
}
调用:
DomXML::CreateXML("../demo.xml");
创建成功