C++、Qt分别读写xml文件的方法实例

在C++及Qt中,读写XML文件是一项常见的任务。下面分别介绍C++和Qt中读写XML的方法及其实现,包括如何使用第三方库、如何解析XML文件的基本组成部分。

C++中读写XML文件

C++中可以使用第三方库TinyXML来读写XML文件。下面介绍如何使用TinyXML进行XML文件读写。

1、创建XML文件

要写入XML文件,首先需要文件句柄。然后创建XML节点和子节点,并将它们插入到文件中。代码如下:

#include "tinyxml.h"
int main()
{
    TiXmlDocument doc;
    TiXmlDeclaration *pDeclaration = new TiXmlDeclaration("1.0", "utf-8", "yes");
    TiXmlElement *pRootElement = new TiXmlElement("Root");
    doc.LinkEndChild(pDeclaration);
    doc.LinkEndChild(pRootElement);

    // 创建第一个子节点
    TiXmlElement *pElement = new TiXmlElement("ChildNode1");
    pElement->LinkEndChild(new TiXmlText("Content of the ChildNode1 tag"));
    pRootElement->LinkEndChild(pElement);

    // 创建第二个子节点
    pElement = new TiXmlElement("ChildNode2");
    pElement->SetAttribute("attribute", "the attribute value");
    pElement->LinkEndChild(new TiXmlText("Content of the ChildNode2 tag"));
    pRootElement->LinkEndChild(pElement);

    doc.SaveFile("new_file.xml"); // 保存XML文件
    return 0;
}

可以看到,这里首先创建了一个XML文档对象doc,并在其中添加了声明节点和根节点pRootElement。然后,我们创建了两个子节点pElement1和pElement2,并使用LinkEndChild方法将它们添加到根节点pRootElement中。pElement1没有额外的属性,所以只需要添加一个text子节点。pElement2有一个名为“attribute”的属性,所以我们使用SetAttribute方法来设置该属性。

2、读取XML文件

要读取XML文件,需要先打开文件句柄,然后遍历XML节点,并获取其中的内容和属性。代码如下:

#include "tinyxml.h"
#include <iostream>
int main()
{
    TiXmlDocument doc("new_file.xml");
    bool isLoaded = doc.LoadFile(); // 加载XML文件
    if (!isLoaded)
    {
        std::cout << "Could not load the XML file." << std::endl;
        return -1;
    }

    TiXmlElement *pRootElement = doc.RootElement();
    TiXmlElement *pElem = pRootElement->FirstChildElement();
    while (pElem)
    {
        std::cout << pElem->Value() << std::endl;
        const char *pText = pElem->GetText();
        if (pText)
        {
            std::cout << "Text: " << pText << std::endl;
        }
        TiXmlAttribute *pAttribute = pElem->FirstAttribute();
        while (pAttribute)
        {
            std::cout << pAttribute->Name() << " = " << pAttribute->Value() << std::endl;
            pAttribute = pAttribute->Next();
        }
        pElem = pElem->NextSiblingElement();
    }
    return 0;
}

我们首先用TiXmlDocument类的LoadFile方法加载XML文件。然后,我们检查XML文件是否成功加载。如果没有加载成功,我们就输出一条错误消息并退出程序。否则,我们取得根节点pRootElement,然后以FirstChildElement方法开始遍历其子节点。对于每个节点,我们输出其名称(Value);如果该节点有文本内容,我们输出其文本内容(GetText)。我们还遍历了节点的属性,输出它们的名称(Name)和值(Value)。

Qt中读写XML文件

在Qt中,可以使用QXmlStreamReader和QXmlStreamWriter两个类来读写XML文件。下面介绍如何使用这两个类进行XML文件读写。

1、创建XML文件

要写入XML文件,我们创建QFile对象并打开文件,然后创建QXmlStreamWriter对象并设置文件输出流。我们可以创建XML节点和子节点,并把它们写入到文件中。代码如下:

#include <QFile>
#include <QXmlStreamWriter>
int main()
{
    QFile file("new_file.xml");
    if (!file.open(QFile::WriteOnly | QFile::Truncate))
        return -1;

    QXmlStreamWriter xmlWriter(&file);

    xmlWriter.setAutoFormatting(true);
    xmlWriter.writeStartDocument();
    xmlWriter.writeStartElement("Root");

    // 创建第一个子节点
    xmlWriter.writeStartElement("ChildNode1");
    xmlWriter.writeCharacters("Content of the ChildNode1 tag");
    xmlWriter.writeEndElement();

    // 创建第二个子节点
    xmlWriter.writeStartElement("ChildNode2");
    xmlWriter.writeAttribute("attribute", "the attribute value");
    xmlWriter.writeCharacters("Content of the ChildNode2 tag");
    xmlWriter.writeEndElement();

    xmlWriter.writeEndElement();
    xmlWriter.writeEndDocument();

    file.close();
    return 0;
}

可以看到,我们首先打开文件new_file.xml,并创建了QXmlStreamWriter对象xmlWriter,并设置了其自动格式化属性为true。然后,我们使用writeStartDocument方法写入XML声明,并使用writeStartElement写入根节点。然后,我们使用writeStartElement创建每个子节点,使用writeAttributes设置其属性,使用writeCharacters写入内容,最后使用writeEndElement结束该子节点。以此类推,直到我们结束最后一个子节点并使用writeEndElement结束根节点。我们最后调用writeEndDocument方法来结束XML文件。

2、读取XML文件

要读取XML文件,我们创建QFile对象并打开文件,然后创建QXmlStreamReader对象并设置文件输入流。我们可以遍历XML节点,并获取其中的内容和属性。代码如下:

#include <QFile>
#include <QXmlStreamReader>
#include <QDebug>
int main()
{
    QFile file("new_file.xml");
    if (!file.open(QFile::ReadOnly | QFile::Text))
        return -1;

    QXmlStreamReader xmlReader(&file);

    while (!xmlReader.atEnd() && !xmlReader.hasError())
    {
        QXmlStreamReader::TokenType token = xmlReader.readNext();
        if (token == QXmlStreamReader::StartElement)
        {
            qDebug() << "Element:" << xmlReader.name();

            if (xmlReader.attributes().count() > 0)
            {
                qDebug() << "Attributes:";
                QXmlStreamAttributes attributes = xmlReader.attributes();
                for (int i = 0; i < attributes.count(); i++)
                {
                    qDebug() << attributes.at(i).name() << " = " << attributes.at(i).value();
                }
            }
        }
        else if (token == QXmlStreamReader::Characters && !xmlReader.isWhitespace())
        {
            qDebug() << "Text:" << xmlReader.text().toString();
        }
    }

    file.close();
    return 0;
}

我们首先打开文件,然后创建QXmlStreamReader对象xmlReader,并设置其为文件输入流。我们在循环中使用readNext方法读取每个XML节点,并根据节点的类型进行处理。对于每个StartElement节点,我们调用name方法来输出其名称,并检查它是否有属性(attributes)。如果有属性,我们使用attributes方法获得这些属性,并输出它们的名称(name)和值(value)。对于Characters节点,我们使用text方法获得文本内容,并打印出来。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++、Qt分别读写xml文件的方法实例 - Python技术站

(0)
上一篇 2023年5月30日
下一篇 2023年5月30日

相关文章

  • 微信怎么截图 手机微信截图的三种方法介绍

    以下是“微信怎么截图 手机微信截图的三种方法介绍”的完整攻略: 微信怎么截图? 微信是一款流行的社交软件,用户可以通过微信进行聊天、朋友圈、支付等功能。如果需要截图,可以按照以下三种方法进行: 方法一:使用手机自带截图功能 大多数手机都自带截图功能,可以通过以下步骤进行: 打开微信:在手机上打开微信。 打开要截图的内容:在微信中打开要截图的内容,例如聊天记录…

    html 2023年5月18日
    00
  • APK包名修改 请问如何修改APK包名

    APK包名修改攻略 什么是APK包名 APK包名指Android应用程序制作时指定的包名(Package Name),其是应用程序的唯一标识符,用于避免应用程序之间出现包名冲突,从而达到应用程序独立存在的目的。 APK包名修改的原因 有些时候,开发者需要修改APK包名,比如当需要发布一个新的版本但是已经存在了旧版本时,为了保证新旧版本的独立存在,需要修改包名…

    html 2023年5月30日
    00
  • C#实现XML文件读取

    下文将分为以下几个部分来介绍C#实现XML文件读取的完整攻略: 配置项目引用 加载XML文件 选择节点 读取节点属性 读取节点文本内容 示例说明 1. 配置项目引用 要使用C#读取XML文件,我们需要先在项目中添加对System.XML的引用。可以在项目属性 -> 引用 -> 程序集 -> 框架中添加。也可以在NuGet中搜索“System…

    html 2023年5月30日
    00
  • springboot配置文件属性变量引用方式${}和@@用法及区别说明

    Spring Boot 的配置文件可以通过 ${} 或 @@ 语法引用属性变量。这两种语法虽然看起来非常相似,但实际上有一些区别。 使用 ${} 引用属性变量 语法说明 ${} 语法用于引用配置文件中的属性变量。在配置文件中可以定义一个属性,然后在其他地方通过 ${} 语法来引用该属性。语法格式如下: ${属性键名:默认值} 其中,属性键名是属性的名称,可以…

    html 2023年5月30日
    00
  • 简单html以及css的用法详解

    下面我将详细讲解“简单html以及css的用法详解”的攻略。 简单HTML及CSS的用法详解 1. HTML的基本用法 HTML(HyperText Markup Language)是构成网页的标准语言。它由一系列的标签(tag)构成。 1.1 HTML标签的基本语法 一个标签一般由三部分组成:开始标签、内容和结束标签。其中,大部分标签都需要有开始和结束标签…

    html 2023年5月30日
    00
  • android POST数据遇到的UTF-8编码(乱码)问题解决办法

    下面是详细讲解“android POST数据遇到的UTF-8编码(乱码)问题解决办法”的完整攻略。 问题描述 在进行android开发过程中,有时我们需要进行POST请求以及传递中文数据。但是在发送POST请求时,如果参数带有中文字符,则会出现乱码的现象。这是由于UTF-8编码与其他编码方式不同,导致服务器端无法正确理解。那么我们需要采取什么措施来解决这个问…

    html 2023年5月31日
    00
  • Android高级xml布局之输入框EditText设计

    当我们在Android应用程序开发中设计界面时,输入框(EditText)是经常用到的控件之一。EditText可以让用户在应用程序中输入文本、数字、邮箱等。如何设计好EditText控件,让用户在我们的应用程序中可以更加方便地输入内容呢?下面就是关于Android高级xml布局之输入框EditText设计的完整攻略。 设置EditText的属性 输入类型 …

    html 2023年5月30日
    00
  • C++实现读写ini配置文件的示例代码

    首先,INI文件是一种非常常见的配置文件格式,它用于存储应用程序的配置信息。在C++中,使用WinAPI中的GetPrivateProfileString和WritePrivateProfileString函数可以方便地读取和写入INI文件。 下面是使用C++实现读写INI配置文件的示例代码和详细攻略: 读取INI配置文件 第一步:包含相关头文件 #incl…

    html 2023年5月30日
    00
合作推广
合作推广
分享本页
返回顶部