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

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。

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

编写代码时,只需要包含 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;
}

编译运行结果如下:

生成的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

版权声明:本博客文章,大多是本人整理编写,或在网络中收集,转载请注明出处!!

时间: 2024-08-12 14:11:57

C++通过TinyXML类库读写XML文件的相关文章

使用dom4j 读写xml文件

dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个十分优秀的JavaXML API,具有性能优异.功能强大和极其易使用的特点,同时它也是一个开放源代码的软件. String fileName="D:\\version.xml"; File inputXML=new File(fileName); //使用 SAXReader 解析 XML 文档 version.xml SAXReader saxReader=new SAXReader();

C#读写xml文件

c#读写xml文件已知有一个XML文件(bookstore.xml)如下: Code<?xml version="1.0" encoding="gb2312"?><bookstore> <book genre="fantasy" ISBN="2-3631-4"> <title>Oberon's Legacy</title> <author>Corets,

iOS 读写xml文件

//*********写入文件,传入要保存的信息*********//保存xml -(void) saveXml:(NSString *)data { //创建文件管理器 NSFileManager *fileManager = [NSFileManager defaultManager ]; //获取路径 //参数NSDocumentDirectory要获取那种路径 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentD

JAXB方式读写XML文件

import java.io.File; import java.util.ArrayList; import java.util.List; import javax.xml.bind.JAXB; import org.apache.log4j.Logger; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; import cn.com.starit.ts.nms.collec

PHP读写XML文件的四种方法

PHP对XML文件进行读写操作的方法一共有四种,分别是:字符串方式直接读写.DOMDocument读写. XMLWrite写和XMLReader读.SimpleXML读写,本文将依次对这四种方法进行介绍. 介绍之前首先对本文例子使用的数据和文件进行说明.本文写XML文件的例子都是从MySQL中读取数据然后 写入到XML文件中,读XML文件的例子都是从XML文件中读取数据后组装成数组的格式,数组中每个元素对应数 据库中的一条记录. MySQL中的数据: XML文件: 1 2 3 4 5 6 7 8

cocos2d-x 读写 xml 文件

cocos2d-x 读写 xml 文件 A product of cheungmine 使用cocos2d-x开发2d游戏确实方便,但是对于一般的小游戏,经常需要的工作是UI布局设计和调整,代码改来改去,真不方便.做游戏开发早晚要有自己的UI模块.不妨称之为cocos2d-layout.cocos2d-layout相当于舞台的布景.布景师根据导演的要求(xml)来生成舞台.布景师在现实生活中当然是人来做,在程序里就是一段程序或代码库.这个没用通用的万能的库可以做这个事情,因为游戏的内容是差别很大

PHP读写XML文件(一)

PHP读写XML文件的方法有四种,从本文开始将连续使用四篇博文来分别介绍这四种方法.本文介绍的是第一种方法: 使用字符串操作的方式来对XML文件进行读写操作. 一.PHP字符串方式写XML文件: 首先介绍PHP使用字符串方式写XML文件.本例将读取数据库中的数据,输出为XML文件. 数据库数据如下: 读取数据并写入XML文件代码: <?php /** * function:使用字符串方式写XML文件 * author:JetWu * date:2016.12.03 **/ $mysqli = m

C#读写xml文件的常用方法

已知有一个XML文件(bookshop.xml)如下: <?xml version="1.0" encoding="gb2312" ?> <bookshop> <book genre="fantasy" ISBN="2-2312-2"> <title>Oberon Legacy</title> <author>Eva</author> <

ASP.NET读写XML文件

本文中的方式主要是用序列化与反序列化的方式来实现读写xml文件,注意,不是特指的web.config文件,是指自定义的config文件. 下面的是一个xml读写操作类,包含读方法用到了反序列化方式,还有写方式,用到了序列化方式. using System; using System.IO; using System.Web; using System.Xml.Serialization; namespace WX_Tools { /// <summary> /// Xml文件读写类 /// &