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

目录
  • XML语法
  • C++使用tinyxml读写xml
  • Qt读写xml
  • 总结

XML语法

第一行是XML文档声明,<>内的代表是元素,基本语法如以下所示。C++常见的是使用tiny库读写,Qt使用自带的库读写;

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<根元素>
   <元素 属性名="属性值" 属性名="属性值">Text</元素>
   <元素 属性名="属性值" 属性名="属性值">
       <子元素>Text</子元素>
   </元素>
</根元素>

C++使用tinyxml读写xml

首先从网站下载tinyxml库,

将6个文件加载到自己的项目中:

写XML:

新建文件并写入:

#include "include/tinyxml.h"

string strPath = "E:/test.xml";
TiXmlDocument *writeDoc = new TiXmlDocument; //xml文档指针
//文档格式声明
TiXmlDeclaration *decl = new TiXmlDeclaration("1.0", "UTF-8", "yes");
writeDoc->LinkEndChild(decl); //写入文档
//TiXmlElement父类的析构函数内自带delete,所以不用自己释放
TiXmlElement *RootElement = new TiXmlElement("Camera");//根元素
RootElement->SetAttribute("num", "3"); //属性
writeDoc->LinkEndChild(RootElement);
TiXmlElement *StuElement = new TiXmlElement("Exposure");//Stu
//设置属性
StuElement->SetAttribute("time", "A");
StuElement->SetAttribute("deley", "30");
RootElement->LinkEndChild(StuElement);//父节点写入文档
//子元素
TiXmlElement *sonElement1 = new TiXmlElement("max");
StuElement->LinkEndChild(sonElement1);
TiXmlText *maxContent = new TiXmlText("1000");
sonElement1->LinkEndChild(maxContent);

TiXmlElement *sonElement2 = new TiXmlElement("min");
StuElement->LinkEndChild(sonElement2);
TiXmlText *minContent = new TiXmlText("80");
sonElement2->LinkEndChild(minContent);

writeDoc->SaveFile(strPath.c_str());
delete writeDoc;

最终生成的xml文件是:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<Camera num="3">
    <Exposure time="A" deley="30">
        <max>1000</max>
        <min>80</min>
    </Exposure>
</Camera>

所以,使用tinyxml函数库中的类去读写根元素,text和属性。这里主要用到的就是四个类和三个函数:

<TiXmlDeclaration>
<TiXmlElement>
     <TiXmlElement>
        <TiXmlElement>TiXmlText</TiXmlElement>
     </TiXmlElement>
</TiXmlElement>

四个类:

  • TiXmlDocument:定义一些基本的xml文件的基本操作,包含文件流;
  • TiXmlDeclaration:用于xml文件的第一行,定义xml文件的声明操作;
  • TiXmlElement:不管根元素,元素和子元素,都用此类;
  • TiXmlText:用于元素内的text的操作;

三个函数:

  • LinkEndChild:将子元素嵌在父元素内,还可以将text加到元素内
  • SetAttribute:设置元素内的属性名称与属性值
  • SaveFile:用于保存xml文件;如果xml文件不存在,会自动创建一个;

读XML:

TiXmlDocument mydoc("E:/test.xml");
if(!mydoc.LoadFile())
{
   return;
}
TiXmlElement *RootElement = mydoc.RootElement();   //获取根元素
//遍历根元素下的元素
for(TiXmlElement *StuElement = RootElement->FirstChildElement();//第一个子元素
		StuElement != NULL;
		StuElement = StuElement->NextSiblingElement())//下一个兄弟元素
{
        //先找到Exposure元素
		if (0 == strcmp("Exposure", StuElement->Value()))
		{
			//遍历Exposure元素下的子元素
			for (TiXmlElement *sonElement = StuElement->FirstChildElement();
			     sonElement != NULL;
				 sonElement = sonElement->NextSiblingElement())
			{
				//找到max元素,并输出元素内的text
				if (0 == strcmp("max", sonElement->Value()))
				{
					string str = sonElement->GetText();
					cout << str.c_str() << endl;
				}
			}
		}
}

Qt读写xml

写XML:

//头文件
#include <QDomDocument>
QString fileName = "E:/test.xml";
QFile file(fileName);
if(!file.open(QIODevice::WriteOnly|QIODevice::Truncate))
  return;
//定义xml文件
QDomDocument doc;
//定义格式头
QDomProcessingInstruction ins = doc.createProcessingInstruction("xml","version = \'1.0\' encoding = \'utf-8\'");
//追加元素
doc.appendChild(ins);
//根节点元素
QDomElement root = doc.createElement("Camera");
doc.appendChild(root);
//在根节点的基础上增加一个子节点
QDomElement sonEmt = doc.createElement("Exposure");
//创建元素的属性名
QDomAttr sonAttr = doc.createAttribute("time");
//创建元素的属性值
sonAttr.setNodeValue("100");
//节点和属性关联
sonEmt.setAttributeNode(sonAttr);
root.appendChild(sonEmt);
//在根节点的基础上增加一个子节点,并设置子节点的text
QDomElement sonOneEmt = doc.createElement("max");
QDomText sonOneText = doc.createTextNode("1000");
sonOneEmt.appendChild(sonOneText);
sonEmt.appendChild(sonOneEmt);

QDomElement sonTwoEmt = doc.createElement("min");
QDomText sonTwoText = doc.createTextNode("80");
sonTwoEmt.appendChild(sonTwoText);
sonEmt.appendChild(sonTwoEmt);

//写入文件
QTextStream stream(&file);
doc.save(stream,4);//4缩进

这里对应的类有:

<QDomProcessingInstruction>
<QDomElement>
   <QDomElement>QDomText</QDomElement>
   <QDomElement QDomAttr>
   </QDomElement>
</QDomElement>

读XML:

#include <QXmlStreamReader>

QDomDocument doc;
QString fileName = "E:/test.xml";
QFile file(fileName);
if(!file.open(QIODevice::ReadOnly|QIODevice::Truncate))
{
    return;
}
else
{
    //将文件内容读到doc中
    if(!doc.setContent(&file))
        file.close();
    //返回根元素
    QDomElement root = doc.documentElement();
    //返回根元素的名称
    QDomNode n = root.firstChild();
    while(!n.isNull())
    {
       if(n.isElement())
       {
         QDomElement e = n.toElement();
         QString strXML = qPrintable(e.tagName());
         //判断第一个节点
         if("Exposure" == strXML)
         {
             //遍历寻找Exposure元素下的子元素,并找到其text
             QDomNodeList list = e.childNodes();
             for(int i=0;i<list.count();i++)
             {
                QDomNode node = list.at(i);
                strXML = qPrintable(node.toElement().tagName());
                //判断第二个元素
                if(node.isElement() && "max"== strXML)
                  QString textStr = qPrintable(node.toElement().text());//读取子元素内的text
             }
         }
       }
    }
}

界面读取的效果为:

总结

到此这篇关于C++、Qt分别读写xml文件的文章就介绍到这了,更多相关C++ Qt读写xml文件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Qt读写XML文件的方法详解(含源码+注释)

    目录 一.示例XML文件内容 二.XML文件的写入 三.XML文件的读取 3.1 文件读取源码 3.2 读取结果示例 总结 相关文章 一.示例XML文件内容 下方为本文所使用的xml文件的内容 <?xml version="1.0" encoding="UTF-8"?> <root> <childNode1 attruKey="attriVal">childNode1 Val</childNode1>

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

    目录 XML语法 C++使用tinyxml读写xml Qt读写xml 总结 XML语法 第一行是XML文档声明,<>内的代表是元素,基本语法如以下所示.C++常见的是使用tiny库读写,Qt使用自带的库读写: <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <根元素> <元素 属性名="属性值" 属性名="属性

  • C#通过DataSet读写xml文件的方法

    本文实例讲述了C#通过DataSet读写xml文件的方法.分享给大家供大家参考.具体实现方法如下: DataSet ds = new DataSet(); //读取Xml文件 ds.ReadXml(Server.MapPath("xml/song.xml")); //生成Xml文件 ds.WriteXml(Server.MapPath("xml/song_bak.xml")); 希望本文所述对大家的C#程序设计有所帮助.

  • jQuery加载及解析XML文件的方法实例分析

    本文实例讲述了jQuery加载及解析XML文件的方法.分享给大家供大家参考,具体如下: 1.简述 XML(eXtensible Markup Language)即可扩展标记语言,与HTML一样,都是属于SGML标准通用语言. 2. Content-Type 很多情况下XML文件不能正常解析都是由于Content-Type没有设置好.如果Content-Type本身就是一个XML文件则不需要设置:如果是由后台程序动态生成的,那么就需要设置Content-Type为"text/xml",否

  • PHP读取XML文件的方法实例总结【DOMDocument及simplexml方法】

    本文实例讲述了PHP读取XML文件的方法.分享给大家供大家参考,具体如下: 使用DOMDocument对象读取xml 创建一个DOMDocument对象 $doc = new DOMDocument(); 载入xml文件 $doc->load("book.xml"); 获取标签对象 $books = $doc->getElementsByTagName("book"); 获取标签的子对象 $titles = $book->getElementsBy

  • Python3利用openpyxl读写Excel文件的方法实例

    前言 Python中常用的操作Excel的三方包有xlrd,xlwt和openpyxl等,xlrd支持读取.xls和.xlsx格式的Excel文件,只支持读取,不支持写入.xlwt只支持写入.xls格式的文件,不支持读取. openpyxl不支持.xls格式,但是支持.xlsx格式的读取写入,并且支持写入公式等. 原始数据文件apis.xlsx内容: name method url data json result get接口 get https://httpbin.org/get?a=1&b=

  • python使用pandas读写excel文件的方法实例

    目录 引言 读取excel文件 写入文件: 总结 引言 现在本地创建一个excel表,以及两个sheet,具体数据如下: sheet1: sheet2: 读取excel文件 pandas.read_excel(io, sheet_name=0, header=0, names=None, index_col=None, usecols=None) io:excel文件路径. sheet_name:返回指定的sheet. header:表头,默认值为0.也可以指定多行.当header取值为None

  • C#读写txt文件多种方法实例代码

    1.添加命名空间 复制代码 代码如下: System.IO;System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char数组,然后输出. 复制代码 代码如下: byte[] byData = new byte[100];        char[] charData = new char[1000];        public void Read()        {            try            {          

  • Qt读写ini文件的方法详解(含源码+注释)

    目录 一.示例Ini文件内容 二.Ini文件的写入 三.Ini文件的读取 3.1 第一种读取方式 3.2 第二种读取方式 3.3 读取结果示例 补充:获取所有节点和key以及节点的遍历 相关文章 总结 一.示例Ini文件内容 下方为本文所使用的ini文件的内容 [group1] key1=val1 key2=val2 sameKay=sameVal [group2] jian1=zhi1 jian2=zhi2 sameKay=sameZhi 二.Ini文件的写入 ini文件不需要像xml和jso

  • 读写XML文件的内容并将其显示在ListView控件上的方法

    XML文件由内容和标记组成.通过标记包围内容的方式将大部门内容包含在元素中[1].XML的节点便于程序配置进行灵活的扩展,特别是存在以数组格式的配置信息时,增加行或列只需要修改XML文件而无需修改源代码. 1. XML文件介绍 (1)声明 XML 文档的第一行可以是一个 XML 声明[1]这是文件的可选部分,它将文件识别为 XML 文件,有助于工具和人类识别 XML(不会误认为是 SGML 或其他标记).可以将这个声明简单地写成 <?xml?>,或包含 XML 版本<?xml versi

  • C#读写xml文件方法总结(超详细!)

    目录 C#写入xml文件 1.XmlDocument 2.DataSet对象里的值来生成XML文件 3.利用XmlSerializer来将类的属性值转换为XML文件的元素值. 示例:写入xml 1.创建xml文档 2 .增加节点 3 .修改节点: 4 .删除节点 c#读取xml文件 总结 C#写入xml文件 1.XmlDocument 1.我认为是最原始,最基本的一种:利用XmlDocument向一个XML文件里写节点,然后再利用XmlDocument保存文件.首先加载要写入的XML文件,但是如

随机推荐