QT 读写xml

一、xml说明:

1.被设计用来传输和存储数据,是一种可扩展标记语言,能够实现跨系统传输数据。

2.xml举例。

 <?xml version="1.0" encoding="UTF-8"?>
 <bookstore>
      <book category="CHILDREN">
          <title>Harry Potter</title>
          <year>2005</year>
      </book>
 </bookstore>

如上第一行为xml文档的说明,version和enconding分别代表当前xml文档的版本和编码方式。

xml元素:XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。一个元素可以包含:子元素、文本、属性。

如bookstore元素为根元素、book元素为bookstore的子元素,category="CHILDREN"为book元素的属性。title元素为book元素的子元素,Harry Potter为其文本。

二、项目配置:

pro文件里面添加QT+=xml,操作xml的头文件包含include <QtXml>或include <QDomDocument>。

三、写xml:

void HandleXml::writeXml(QString xmlPath)
{
    QFile file(xmlPath); //相对路径、绝对路径、资源路径都可以
    if(!file.open(QFile::WriteOnly|QFile::Truncate)) //可以用QIODevice,Truncate表示清空原来的内容
        return;
    QDomDocument doc;
    QDomProcessingInstruction instruction; //添加xml说明
    instruction=doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
    doc.appendChild(instruction);
    QDomElement root=doc.createElement("bookstore"); //创建根元素
    doc.appendChild(root); //添加根元素
    QDomElement bookElement=doc.createElement("book"); //一级子元素
    bookElement.setAttribute("category","CHILDREN"); //方式一:创建属性  其中键值对的值可以是各种类型
//    QDomAttr category=doc.createAttribute("time"); //方式二:创建属性 值必须是字符串
//    category.setValue("CHILDREN");
//    bookElement.setAttributeNode(time);
    QDomElement titleElement=doc.createElement("title"); //二级子元素
    titleElement.appendChild(doc.createTextNode("Harry Potter")); //为titleElement元素增加文本
    QDomElement yearElement=doc.createElement("year"); //二级子元素
    yearElement.appendChild(doc.createTextNode("2005")); //为yearElement元素增加文本
    bookElement.appendChild(titleElement); //增加子元素
    bookElement.appendChild(yearElement);
    root.appendChild(bookElement);
    QTextStream out_stream(&file); //输出到文件
    doc.save(out_stream,2); //缩进4格
    file.close();
}

四、读xml:

void HandleXml::readXml(QString xmlPath)
{
    QFile file(xmlPath);
    if(!file.open(QFile::ReadOnly))
        return;
    QDomDocument doc;
    if(!doc.setContent(&file))
    {
        file.close();
        return;
    }
    file.close();
    QDomElement bookStoreElement=doc.documentElement(); //返回根元素
    qDebug()<<"开始打印xml内容:";
    qDebug()<<bookStoreElement.tagName();
    QDomNodeList bookNodeList=bookStoreElement.childNodes();
    for(int i=0; i<bookNodeList.count(); i++)
    {
        QDomElement bookElement=bookNodeList.at(i).toElement();
        qDebug()<<"  "<<bookElement.tagName()<<" "<<bookElement.attribute("category","");
        QDomNodeList childNodeList=bookElement.childNodes();
        for(int j=0; j<childNodeList.count(); j++)
        {
            QDomElement childElement=childNodeList.at(i).toElement();
            qDebug()<<"    "<<childElement.tagName()<<" "<<childElement.text();
        }
    }
}

打印如下:

"bookstore"

"book" "CHILDREN"

"title" "Harry Potter"

"title" "Harry Potter"

 

posted @ 2020-10-11 22:25  xianyongchao  阅读(3116)  评论(0编辑  收藏  举报