目录
前言
QtXml模块提供了一个读写XML文件的流,解析方法包含DOM和SAX。DOM(Document ObjectModel):将XML文件表示成一棵树,便于随机访问其中的节点,但消耗内存相对多一些。SAX(Simple APIfor XML):一种事件驱动的XML API,接近于底层,速度较快,但不便于随机访问任意节点。
使用XML模块,在.pro文件中添加QT += xml,并加如相应的头文件#include <QDomDocument>
1、XML写操作
QDomDocument类代表整个的XML文件。概念上讲:它是文档树的根节点,并提供了文档数据的基本访问方法。由于元素、文本节点、注释、指令执行等等不可能脱离一个文档的上下文,所以文档类也包含了需要用来创建这些对象的工厂方法。被创建的节点对象有一个ownerDocument()函数,它将对象与对象常见的文档上下文环境关联起来。DOM类中最常使用的是QDomNode、QDomDocument、QDomElement和QDomText。
void QtXmlDemo::writeXml(){
QDomDocument domDoc;
QDomProcessingInstruction version =
domDoc.createProcessingInstruction("xml", "version = \"1.0\" encoding = \"GB2312\"");
domDoc.appendChild(version);
QDomElement domRootElement = domDoc.createElement("Fantast"); //创建顶节点
domDoc.appendChild(domRootElement);
QDomElement itemRootElement = domDoc.createElement("teacher"); //创建父节点
{
QDomElement node1 = domDoc.createElement("tearchName"); //创建子结点
QDomText domText1 = domDoc.createTextNode("tearchName");
domText1.setData(ui.writeTearchName->text()); //设置子结点数据
node1.appendChild(domText1); //将子节点数据绑定
itemRootElement.appendChild(node1); //将子节点帮到父节点
QDomElement node2 = domDoc.createElement("schoolName");
QDomText domText2 = domDoc.createTextNode("schoolName");
domText2.setData(ui.writeSchoolName->text());
node2.appendChild(domText2);
itemRootElement.appendChild(node2);
QDomElement node3 = domDoc.createElement("tearchYear");
QDomText domText3 = domDoc.createTextNode("tearchYear");
domText3.setData(QString::number(ui.wirteTearchYear->text().toInt()));
node3.appendChild(domText3);
itemRootElement.appendChild(node3);
QDomElement node4 = domDoc.createElement("course");
QDomText domText4 = domDoc.createTextNode("course");
domText4.setData(ui.writeCourse->text());
node4.appendChild(domText4);
itemRootElement.appendChild(node4);
QDomElement node5 = domDoc.createElement("grade");
QDomText domText5 = domDoc.createTextNode("grade");
domText5.setData(ui.writeGrade->text());
node5.appendChild(domText5);
itemRootElement.appendChild(node5);
QDomElement node6 = domDoc.createElement("cityName");
QDomText domText6 = domDoc.createTextNode("cityName");
domText6.setData(ui.writeCity->text());
node6.appendChild(domText6);
itemRootElement.appendChild(node6);
}
domRootElement.appendChild(itemRootElement); //绑定到顶结点
QFile m_file;
m_file.setFileName("ReadWrite.xml");
if (m_file.open(QIODevice::ReadWrite | QFile::Text)) {
m_file.write(domDoc.toString().toLocal8Bit().data());
m_file.close();
}
}
2、XML读操作
解析后的XML文件在内部是通过一个对象树来表示的,对象树可以使用各种QDom类进行访问。所有的QDom类只引用内部树上的对象。一旦最后一个DOM树的QDom对象和QDocument本身被删除掉时,DOM树上的所有内部对象会被删除掉。元素、文本节点等的创建是通过使用类提供的各种工厂方法完成的。使用QDom类的缺省构造函数只会生成空的对象,这些空的对象不能操作,也不能写入到文档中。
QDomDocument::setContent()完成XML文档的设置,他从QFile对象中读取XML数据并检测XML文档的编码。setContent()有几种重载形式,可以分别从QByteArray、QString、QIODevice、QXmlInputSource中读取XML数据。
void QtXmlDemo::readXml() {
QFile m_file;
m_file.setFileName("ReadWrite.xml");
if (m_file.open(QIODevice::ReadWrite | QFile::Text)) {
QDomDocument doc;
if (!doc.setContent(&m_file))
{
m_file.close();
qDebug() << " Read Open Xml false";
return;
}
qDebug() << " Read Open Xml true";
QDomElement root = doc.documentElement(); //读取根节点
QDomNode node = root.firstChild(); //读取第一个父节点
while (!node.isNull())
{
QDomNodeList sonNodeList = node.childNodes(); //读取子结点集合
QString rootName = node.toElement().tagName(); //读取父节点名字
if (rootName.compare("teacher") == 0)
{//将子结点集合传进去读取子结点数据
for (int sonNode = 0; sonNode < sonNodeList.size(); sonNode++)
{
QDomElement sonElement = sonNodeList.at(sonNode).toElement(); //获取子结点
if (sonElement.toElement().tagName().compare("tearchName") == 0) //与取出子结点进行对比
{
ui.readTearchName->setText(sonElement.text());
}
else if (sonElement.toElement().tagName().compare("schoolName") == 0)
{
ui.readSchoolName->setText(sonElement.text());
}
else if (sonElement.toElement().tagName().compare("tearchYear") == 0)
{
ui.readTearchYear->setText(QString::number(sonElement.text().toInt()));
}
else if (sonElement.toElement().tagName().compare("course") == 0)
{
ui.readCourse->setText(sonElement.text());
}
else if (sonElement.toElement().tagName().compare("grade") == 0)
{
ui.readGrade->setText(sonElement.text());
}
else if (sonElement.toElement().tagName().compare("cityName") == 0)
{
ui.readCity->setText(sonElement.text());
}
}
}
node = node.nextSibling(); //读取下一父节点
}
}
m_file.close();
}
3、运行结果
在左图填入教师信息,点击【写入xml文件】将其写入文件,点击右边【读取xml文件】,将内容读取到,解析出来。
4、Demo下载
可直接去下载demo,尝试运行。
CSDN 0积分下载:Qt之xml读写操作Demo-C++文档类资源-CSDN文库https://download.csdn.net/download/ManagerUser/85496434