Qt Xml的读、写、修改、删除

这篇具有很好参考价值的文章主要介绍了Qt Xml的读、写、修改、删除。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、说明

Xml文件的创建、读取、修改、删除以下图格式为例。
Qt Xml的读、写、修改、删除

二、导入xml

QT       += core gui xml

三、创建Xml

void MainWindow::Xml_Write(QString path)
{
    //! 打开或创建文件
    QFile file(path);
    if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) return; //! Truncate表示清空原来的内容

    //!
    QDomDocument doc;

    //! 添加头文件
    //! <?xml version="1.0" encoding="UTF-8"?>
    QDomProcessingInstruction instruction = doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
    doc.appendChild(instruction);

    //! 添加根节点 <library> </library>
    QDomElement root=doc.createElement("library");
    doc.appendChild(root);
    //! 子节点一
    //! <book time="2021/12/21" id="1"></book>
    QDomElement book=doc.createElement("book");
    //! 将子节点添加到根节点
    root.appendChild(book);
    //! 设置子节点属性(2种方式)
    book.setAttribute("id",1);
    book.setAttribute("time","2021/12/21");

    //! 方式一
    //! book.setAttribute("id",1);
    //! book.setAttribute("time","2021/12/21");
    //! 方式二
    //! QDomAttr time=doc.createAttribute("time"); //方式二:创建属性 值必须是字符串
    //! time.setValue("2222/2/22");
    //! book.setAttributeNode(time);

    //! 子节点中 子元素一
    //! <title>C++ primer</title>
    QDomElement title = doc.createElement("title");
    book.appendChild(title);
    QDomText text = doc.createTextNode("C++ primer");
    title.appendChild(text);

    //! 子节点中 子元素二
    //! <author>Stanley Lippman</author>
    title = doc.createElement("author");
    book.appendChild(title);
    text=doc.createTextNode("Stanley Lippman");
    title.appendChild(text);

    //! 子节点二
    book=doc.createElement("book");
    //! 将子节点添加到根节点
    root.appendChild(book);
    //! 子节点二属性
    book.setAttribute("id",2);
    book.setAttribute("time","2022/2/22");

    //! 子节点二中 子元素一
    title=doc.createElement("title");
    book.appendChild(title);
    text=doc.createTextNode("Thinking in Java");
    title.appendChild(text);

    //! 子节点二中 子元素一
    title=doc.createElement("author");
    book.appendChild(title);
    text=doc.createTextNode("Bruce Eckel");
    title.appendChild(text);

    //! 子节点三
    book =doc.createElement("phone");
    //! 子节点添加到根节点
    root.appendChild(book);
    //! 子节点三属性
    book.setAttribute("id",3);
    book.setAttribute("xiaomi","11");

    //! 子节点三中 子元素一
    title = doc.createElement("price");
    book.appendChild(title);
    text = doc.createTextNode("999");
    title.appendChild(text);

    //! 子节点三中 子元素一
    title = doc.createElement("discount");
    book.appendChild(title);
    text = doc.createTextNode("998");
    title.appendChild(text);

    //输出到文件
    QTextStream out_stream(&file);
    doc.save(out_stream,4); //缩进4格
}

3.1 “写”说明

//! 1.

> //!   
> QDomDocument doc;

//! 2.添加头文件
//! <?xml version="1.0" encoding="UTF-8"?>

> QDomProcessingInstruction instruction =  doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\""); 
> doc.appendChild(instruction);

//! 3.添加根节点(根节点只能有一个,子节点和子节点的子节点个数不限)
//! <library> </library>

> QDomElement root = doc.createElement("library");
> doc.appendChild(root);

//! 4.节点root添加子节点 //! //! //!
QDomElement book=doc.createElement(“book”); //! 将子节点添加到根节点
root.appendChild(book);

//! 5.节点book添加节点元素(1)(以子节点Book)
//! <library>
//! ....<book id="1" time="2021/12/21"> </book>
//! </library>

> //! 方式一
> book.setAttribute("id",1); 
> book.setAttribute("time","2021/12/21");
> //! 方式二:创建元素对象 值必须是字符串 
> QDomAttr id=doc.createAttribute("id");
> id.setValue("1"); 
> book.setAttributeNode(id); 
> //! QDomAttr
> time=doc.createAttribute("time"); 
> time.setValue("2021/12/21");
> book.setAttributeNode(time);

//! 6.子节点book添加子节点
//!<library>
//! ....<book id="1" time="2021/12/21">
//! ........ <title></title>
//! ........ <author></author>
//! ....</book>
//! </library>

>   QDomElement title = doc.createElement("title"); 
>   book.appendChild(title); 
>   //!   
>   QDomElement author = doc.createElement("author");
>   book.appendChild(author);

//! 7.添加元素(2)
//! <library>
//! ....<book id="1" time="2021/12/21">
//! ........<title>C++ primer</title>
//! ........ <author>Stanley Lippman</author>
//! ....</book>
//! </library>

> //! 子节title点添加元素(2)
> //! 创建文本节点text,存储值 
> //! 将文本节点添加到子节点title 
> QDomText text = doc.createTextNode("C++ primer"); 
> title.appendChild(text);
> 
> //! 子节anthor点添加元素(2) 
> text=doc.createTextNode("Stanley Lippman");
> author.appendChild(text);
> //! 8. 保存 //! 打开或创建文件 QFile file(path);
> if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) return; //!
> Truncate表示清空原来的内容 QTextStream out_stream(&file);
> doc.save(out_stream,4); //缩进4格

四、读

void MainWindow::Xml_Read(QString path)
{
    QFile file(path);
    if(!file.open(QFile::ReadOnly)) return;

    QDomDocument doc;
    bool Content = doc.setContent(&file);
    file.close();
    if(!Content) return;


    QDomElement root=doc.documentElement(); //返回根节点
    qDebug()<<root.nodeName();
    QDomNode node=root.firstChild(); //获得第一个子节点

    while(!node.isNull())  //如果节点不空
    {
        if(node.isElement()) //如果节点是元素
        {
            QDomElement e=node.toElement(); //转换为元素,注意元素和节点是两个数据结构,其实差不多
            //qDebug()<<e.nodeName()<<e.tagName()<<" "<<e.attribute("id")<<" "<<e.attribute("time"); //打印键值对,tagName和nodeName是一个东西
            //qDebug()<<e.firstChild().nodeName()<<e.firstChild().toElement().text();
            QDomNodeList list=e.childNodes();
            for(int i=0;i<list.count();i++) //遍历子元素,count和size都可以用,可用于标签数计数
            {
                QDomNode n=list.at(i);
                if(n.isElement()) qDebug()<<n.nodeName()<<":"<<n.toElement().text();
            }
        }
        node=node.nextSibling(); //下一个兄弟节点,nextSiblingElement()是下一个兄弟元素,都差不多
    }
}

4.1 “读”说明

//! 1.打开文件

QFile file(path);
if(!file.open(QFile::ReadOnly)) return;

QDomDocument doc;
bool Content = doc.setContent(&file);
file.close();
if(!Content) return;

//! 2.获取根节点

QDomElement root=doc.documentElement();
//! 打印根节点名
//! qDebug()<<root.nodeName(); // return "library";

//! 3.获取root的第一个子节点

QDomNode node=root.firstChild(); 

//! 4.获取root的下一个子节点

node=node.nextSibling();

//! 5.获取root的所有节点

QDomNodeList list=root.childNodes();

//! 6.各种属性 //! 是否是空节点,是空节点表示读完

node.isNull();

//! 是否是元素节点,即上述添加了元素的节点

node.isElement();

//! 读元素节点的元素(1) //! <book id="1" time="2021/12/21">
//! 为方便叙述,此处不具体写获取节点代码,此处node 表示book节点,后续node对应描述的节点,不再做说明

QDomElement e = node.toElement();
qDebug()<<e.nodeName();  		// return "book";
qDebug()<<e.tagName();   		// return "book";
qDebug()<<e.attribute("id"); 	// return "1";
qDebug()<<e.attribute("time"); 	// return "2021/12/21";

//! 读元素节点的元素(1)
//! <book id="1" time="2021/12/21">
//! …<title>C++ primer</title>
//! …<author>Stanley Lippman</author>
//! </book>
//! node 表示book节点

QDomElement e = node.toElement();
QDomNodeList list=e.childNodes();
QDomNode n=list.at(0);
if(n.isElement()) qDebug()<<n.nodeName()<<":"<<n.toElement().text(); // return "title : C++ primer";
n=list.at(1);
if(n.isElement()) qDebug()<<n.nodeName()<<":"<<n.toElement().text(); // return "author : Stanley Lippman";

五、添加子节点

void MainWindow::Xml_Add(QString path)
{
    //打开文件
    QFile file(path); //相对路径、绝对路径、资源路径都可以
    if(!file.open(QFile::ReadOnly))
        return;

    //增加一个一级子节点以及元素
    QDomDocument doc;
    bool Content = doc.setContent(&file);
    file.close();
    if(!Content) return;

    QDomElement root=doc.documentElement();
    QDomNode node=root.firstChild(); //获得第一个子节点
    int number = 0;
    while(!node.isNull())  //如果节点不空
    {
        number++;
        node= node.nextSibling();
    }
    qDebug()<<number;
    QDomElement book=doc.createElement("book");
    book.setAttribute("id",number+1);
    book.setAttribute("time","1813/1/27");

    QDomElement title=doc.createElement("title");
    QDomText text=doc.createTextNode("Pride and Prejudice");
    title.appendChild(text);
    book.appendChild(title);

    QDomElement author=doc.createElement("author");
    text=doc.createTextNode("Jane Austen");
    author.appendChild(text);
    book.appendChild(author);
    root.appendChild(book);

    if(!file.open(QFile::WriteOnly|QFile::Truncate)) return;//先读进来,再重写,如果不用truncate就是在后面追加内容,就无效了

    //输出到文件
    QTextStream out_stream(&file);
    doc.save(out_stream,4); //缩进4格
    file.close();
}

六、删除节点

void MainWindow::Xml_Delete(QString path)
{
    QFile file(path); //相对路径、绝对路径、资源路径都可以
    if(!file.open(QFile::ReadOnly)) return;

    //删除一个一级子节点及其元素,外层节点删除内层节点于此相同
    QDomDocument doc;
    bool Content = doc.setContent(&file);
    file.close();
    if(!Content) return;

    //! 根节点元素
    QDomElement root=doc.documentElement();
    //! 根据子节点标签名获取所有子节点
    QDomNodeList list=doc.elementsByTagName("book"); //由标签名定位
    for(int i=0;i<list.count();i++)
    {
        QDomElement e=list.at(i).toElement();
        if(e.attribute("time")=="2007/5/25")  root.removeChild(list.at(i)); //以属性名定位,类似于hash的方式,warning:这里仅仅删除一个节点,其实可以加个break
    }

    if(!file.open(QFile::WriteOnly|QFile::Truncate)) return;
    //输出到文件
    QTextStream out_stream(&file);
    doc.save(out_stream,4); //缩进4格
    file.close();
}

七、总结

有点忙,后面两个有时间在解释吧文章来源地址https://www.toymoban.com/news/detail-497090.html

到了这里,关于Qt Xml的读、写、修改、删除的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python批量修改、删除、替换xml文件内容(labelimg标注)

    使用模型训练自定义数据集之前,在用在网上搜索得到的图片制作数据集时,即使批量修改图片名称后,在使用labelimg标注得到的xml文件中,图片名称还是网络上图片原本的名称,这时需要对其进行批量修改。 然后先修改路径,将xml文件对应图片的真实路径替换。这里图片的

    2023年04月15日
    浏览(91)
  • XML的基础知识及XMl文件的创建/读取/更新demo详解

    1.什么是xml? Xml(Extensible Markup Language),可扩展标记语言,一种用于存储数据或传输数据的标记语言,由万维网(W3C开发)。它允许开发人员创建自己的标记,且简单易读,易扩展,支持标准的字符编码,如UFT-8,UTF-16. 2. Xml文档的基本结构 2.1文档声明 ,包括文档版本(ver

    2024年04月09日
    浏览(86)
  • Qt中XML文件创建及解析

    QT的配置文件中添加xml选项: 头文件:#include QXmlStreamWriter 写入的文件如图:   头文件:#include QXmlStreamReader  解析其中的Hobby模块: 输出结果:  

    2024年02月11日
    浏览(38)
  • 常用脚本-持续更新(文件重命名、视频抽帧、拆帧、删除冗余文件、yolo2xml、转换图片格式、修改xml)

    所有代码位置 :Learning-Notebook-Codes/Python/常用脚本 脚本路径: codes/files_rename.py 脚本说明:可以自动重命名某个文件夹下指定类型的文件。 修改前文件名称: img1.jpg 修改后文件名称: Le0v1n-20231123-X-0001.jpg 脚本路径: codes/extract_frames.py 脚本说明:根据帧间隔对某个文件夹下指定

    2024年02月20日
    浏览(52)
  • Python 文件处理指南:打开、读取、写入、追加、创建和删除文件

    文件处理是任何Web应用程序的重要部分。Python有多个用于创建、读取、更新和删除文件的函数。 在Python中处理文件的关键函数是open()函数。open()函数接受两个参数:文件名和模式。 有四种不同的方法(模式)可以打开文件: \\\"r\\\" - 读取 - 默认值。打开一个文件以进行读取,如

    2024年02月05日
    浏览(71)
  • Java 文件处理完全指南:创建、读取、写入和删除文件详细解析

    文件处理是任何应用程序的重要部分。Java 提供了许多用于创建、读取、更新和删除文件的方法。 Java 文件处理 Java 中的文件处理主要通过 java.io 包中的 File 类完成。该类允许我们处理文件,包括创建、读取、写入和删除文件。 要使用 File 类,我们首先需要创建该类的对象,

    2024年03月18日
    浏览(63)
  • c++如何创建、修改及删除文件

    目录 一、创建文件 二、修改文件 三、删除文件 在C++中,可以使用标准库中的fstream头文件来创建和操作文件。其中,ofstream类用于输出文件流(即写入文件),它可以创建新文件或打开已存在的文件,并向其中写入数据。 下面是一个简单的示例代码,在指定路径下创建一个

    2024年02月08日
    浏览(42)
  • 远程xml读取解析,将image url下载到本地,延时队列定时删除文件,图片访问路径保存在数据库中

    远程xml部分内容 mq发布端定时任务发送消息 mq消费端 1,远程xml读取 2,xml解析,将image中图片url保存在集合中 3,遍历集合,当本地不存在此图片时,下载图片至本地 4,将图片路径传给延时队列,用于稍后删除图片 5,保存自定义图片访问路径等信息到数据库 XMLUtil读取远程

    2024年02月15日
    浏览(50)
  • C++文件操作实战:创建、写入、读取、修改文件一应俱全

      概述: 此C++示例详解文件操作:创建、删除、判断存在、写入、读取和修改文件内容。清晰演示了常见文件处理方法及源代码实现。 以下是一个简单的C++实例,演示如何进行文件操作,包括创建文件、删除文件、判断文件是否存在、向文件写入内容、读取文件内容以及修

    2024年03月17日
    浏览(50)
  • node使用fs模块(四)—— 文件夹的使用(创建、读取、删除)

    创建、读取、删除都有同步方法,方法后面加上sync即可。不过多解释了。 参数1: path——读取的文件路径( 必填 ) 参数2: option——读取的文件配置(可选) recursive 是否递归创建,默认为false 参数3: callback——读取回调函数( 必填 ) 参数1: path——读取的文件路径(

    2024年02月06日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包