C++通过TinyXML类库读写XML文件

C++通过TinyXML类库读写XML文件TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。

大家好,又见面了,我是你们的朋友全栈君。

TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。


DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。


使用之前,需要先下载TinyXML类库:http://download.csdn.net/detail/tennysonsky。也可在sourceforge上下载:http://sourceforge.net/projects/tinyxml/


然后解压缩TinyXML后,将这六个文件添加到你的c++工程中,分别是tinystr.h、tinystr.cpp、tinyxml.h、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp。

C++通过TinyXML类库读写XML文件

如本示例中,只有 main.cpp 才是测试代码:

C++通过TinyXML类库读写XML文件


编写代码时,只需要包含 tinyxml.h 头文件即可,但是,编译时却需要把所有.cpp 文件都加上


示例代码如下:

#include <stdio.h>
#include "tinyxml.h"
#include <iostream>
#include <cstring>
using namespace std;

/*
	TiXmlDocument:文档类,它代表了整个xml文件
	TiXmlDeclaration:声明类,它表示文件的声明部分
	TiXmlComment:注释类,它表示文件的注释部分
	TiXmlElement:元素类,它是文件的主要部分,并且支持嵌套结构,一般使用这种结构来分类的存储信息,它可以包含属性类和文本类
	TiXmlAttribute/TiXmlAttributeSet:元素属性,它一般嵌套在元素中,用于记录此元素的一些属性
	TiXmlText:文本对象,它嵌套在某个元素内部
*/
//创建xml文件
int writeXmlFile()
{
	TiXmlDocument *writeDoc = new TiXmlDocument; //xml文档指针
	
	//文档格式声明
	TiXmlDeclaration *decl = new TiXmlDeclaration("1.0", "UTF-8", "yes");
	writeDoc->LinkEndChild(decl); //写入文档

	int n = 3;	//父节点个数

	TiXmlElement *RootElement = new TiXmlElement("Info");//根元素
	RootElement->SetAttribute("num", n); //属性
	writeDoc->LinkEndChild(RootElement);
	
	for(int i=0; i<n; i++)//n个父节点
	{
		TiXmlElement *StuElement = new TiXmlElement("Stu");//Stu
		//设置属性
		StuElement->SetAttribute("class","A");
		if(2 == i)
		{
				StuElement->SetAttribute("class","B");
		}
		
		StuElement->SetAttribute("id",i+1);
		StuElement->SetAttribute("flag", (i+1)*10);
		RootElement->LinkEndChild(StuElement);//父节点写入文档
	
		//姓名
		TiXmlElement *nameElement = new TiXmlElement("name");
		StuElement->LinkEndChild(nameElement);

		TiXmlText *nameContent = new TiXmlText("mike");
		nameElement->LinkEndChild(nameContent);
		
		//分数
		TiXmlElement *scoreElement = new TiXmlElement("score");
		StuElement->LinkEndChild(scoreElement);

		TiXmlText *scoreContent = new TiXmlText("88");
		scoreElement->LinkEndChild(scoreContent);
		
		//城市
		TiXmlElement *cityElement = new TiXmlElement("city");
		StuElement->LinkEndChild(cityElement);

		TiXmlText *cityContent = new TiXmlText("Shenzhen");
		cityElement->LinkEndChild(cityContent);
		
	}
	
	writeDoc->SaveFile("stu_info.xml");
	delete writeDoc;
	
	return 1;
}

//解析xml文件
int readXmlFile()
{
	TiXmlDocument mydoc("stu_info.xml");//xml文档对象
	bool loadOk=mydoc.LoadFile();//加载文档
	if(!loadOk)
	{
		cout<<"could not load the test file.Error:"<<mydoc.ErrorDesc()<<endl;
		exit(1);
	}

	TiXmlElement *RootElement=mydoc.RootElement();	//根元素, Info
	cout<< "[root name]" << RootElement->Value() <<"\n";
	
	TiXmlElement *pEle=RootElement;

	//遍历该结点
	for(TiXmlElement *StuElement = pEle->FirstChildElement();//第一个子元素
		StuElement != NULL;
		StuElement = StuElement->NextSiblingElement())//下一个兄弟元素
	{
		// StuElement->Value() 节点名称
		cout<< StuElement->Value() <<" ";
		TiXmlAttribute *pAttr=StuElement->FirstAttribute();//第一个属性
		
		while( NULL != pAttr) //输出所有属性
		{
			cout<<pAttr->Name()<<":"<<pAttr->Value()<<" ";
			pAttr=pAttr->Next();
		}
		cout<<endl;
		
		//输出子元素的值
		for(TiXmlElement *sonElement=StuElement->FirstChildElement();
		sonElement;
		sonElement=sonElement->NextSiblingElement())
		{
			cout<<sonElement->FirstChild()->Value()<<endl;
		}
	}
	
	return 1;
}

int main(int argc, char *argv[])
{
	
	writeXmlFile();
	printf("\nafter write\n");
	
	readXmlFile();

	return 0;
}

编译运行结果如下:

C++通过TinyXML类库读写XML文件


生成的xml文件内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<Info num="3">
    <Stu class="A" id="1" flag="10">
        <name>mike</name>
        <score>88</score>
        <city>Shenzhen</city>
    </Stu>
    <Stu class="A" id="2" flag="20">
        <name>mike</name>
        <score>88</score>
        <city>Shenzhen</city>
    </Stu>
    <Stu class="B" id="3" flag="30">
        <name>mike</name>
        <score>88</score>
        <city>Shenzhen</city>
    </Stu>
</Info>

本教程示例代码下载请点此链接:http://download.csdn.net/detail/tennysonsky

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/132362.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • PAT乙级习题解答C语言(汇总)「建议收藏」

    PAT乙级习题解答C语言(汇总)「建议收藏」题号 题名 1001 害死人不偿命的(3n+1)猜想 1002 写出这个数 1003 我要通过! 1004 成绩排名 1005 继续(3n+1)猜想 1006 换个格式输出整数 1007 素数对猜想 1008 数组元素循环右移问题 1009 说反话 1010 一元多项式求导 1011…

  • MAVEN使用说明

    MAVEN使用说明

  • java graphics2d 乱码_Graphics2D 中文乱码[通俗易懂]

    今天遇到了一个乱码问题,合成的小票图片上的中文全部变成了口口口,后来在网上查了资料,发现是Graphics2D用了宋体字,而linux服务器上没有对应的字体库。把本地的字体库上传上去就解决了。本地字体库位置:(winXP宋体字)C:\WINDOWS\Fonts\simsun.ttcsimsun.ttc改名为simsun.ttfrz命令(需提前装,其它方式也行)复制到linux:/usr/ja…

  • RabbitMQ入门:路由(Routing)

    在上一篇博客《RabbitMQ入门:发布/订阅(Publish/Subscribe)》中,我们认识了fanout类型的exchange,它是一种通过广播方式发送消息的路由器,所有和exchange建立

  • FQDN_dns资源记录类型有哪些

    FQDN_dns资源记录类型有哪些FQDN全域名(FQDN,FullyQualifiedDomainName)是指主机名加上全路径,全路径中列出了序列中所有域成员。全域名可以从逻辑上准确地表示出主机在什么地方,也可以说全域名是主机名的一种完全表示形式。从全域名中包含的信息可以看出主机在域名树中的位置。例如,acmecompany公司的Web服务器的全域名可以是[url]www.acmecom…

    2022年10月22日
  • Qt 垂直布局 (QVBoxLayout)

    Qt 垂直布局 (QVBoxLayout)Qt垂直布局(QVBoxLayout)上一节说了水平布局:https://blog.csdn.net/weixin_42837024/article/details/82114258QVBoxLayout:在垂直的方向上排列控件上下排列QVBoxLayout*pLayout=newQVBoxLayout();//水平布局QPushButton*p…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号