C++的XML解析器:TinyXML

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

下面是该库的类的继承关系:

在TinyXML中,根据XML的各种元素来定义了一些类:

TiXmlBase:整个TinyXML模型的基类。

TiXmlAttribute:对应于XML中的元素的属性。

TiXmlNode:对应于DOM结构中的节点。

TiXmlComment:对应于XML中的注释

TiXmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>。

TiXmlDocument:对应于XML的整个文档。

TiXmlElement:对应于XML的元素。

TiXmlText:对应于XML的文字部分

TiXmlUnknown:对应于XML的未知部分。

TiXmlHandler:定义了针对XML的一些操作。

Tinyxml使用了两种编译选择:使用标准C的char *类型或者使用STL中的std::string,其中使用预处理器TIXML_USE_STL进行控制,即添加了TIXML_USE_STL为使用std::string的。鉴于STL的广泛使用以及其强大功能,下面我以使用std::string的tinyxml说明。

下面是具体代码实例:

<span style="font-size:18px;">#include<string>
#include <iostream>
#include <exception>
#include "tinyxml.h"
#include "tinystr.h"
using namespace std;
#include <windows.h>
#include <atlstr.h>
CString GetAppPath(){
	TCHAR modulePath[MAX_PATH];
	GetModuleFileName(NULL,modulePath,MAX_PATH);
	CString strModulePath(modulePath);
	strModulePath=strModulePath.Left(strModulePath.ReverseFind('\\'));
	return strModulePath;
}
bool createXMlFile(const string& fullPath){
	try
	{
		//创建一个XML的文档对象。
		TiXmlDocument *myDocument = new TiXmlDocument();
		if (!myDocument)
		{
			return false;
		}
		//定义一个xml文件头部声明
		TiXmlDeclaration *pDeclartion=new TiXmlDeclaration("1.0","UTF-8","yes");
		if(!pDeclartion){
            return false;
		}
		myDocument->LinkEndChild(pDeclartion);
		//创建一个根元素并连接。
		TiXmlElement *rootElement = new TiXmlElement("Persons");
		if (!rootElement)
		{
			return false;
		}
		myDocument->LinkEndChild(rootElement);

		//创建一个Person元素并连接
		TiXmlElement *personElement=new TiXmlElement("person");
		if (!personElement)
		{
			return false;
		}
		rootElement->LinkEndChild(personElement);
		//设置person元素的属性
		personElement->SetAttribute("ID","1");
		//创建name元素,age元素并连接
		TiXmlElement *nameElement=new TiXmlElement("name");
		if (!nameElement)
		{
			return false;
		}
		TiXmlElement *ageElement=new TiXmlElement("age");
		if (!ageElement)
		{
			return false;
		}
		personElement->LinkEndChild(nameElement);
		personElement->LinkEndChild(ageElement);

		//设置name元素和age元素内容
		TiXmlText *nameContent=new TiXmlText("我是NO1");
		if (!nameContent)
		{
			return false;
		}
		TiXmlText *ageContent=new TiXmlText("22");
		if (!ageContent)
		{
			return false;
		}
		nameElement->LinkEndChild(nameContent);
		ageElement->LinkEndChild(ageContent);

		myDocument->SaveFile(fullPath.c_str());
		delete myDocument;
	}
	catch (exception& e)
	{
		cout<<e.what()<<endl;
		return false;
	}
	return true;
}

bool readXml(const string& fullPath){
	try{
		//创建一个xml文档对象
		TiXmlDocument *myDocument=new TiXmlDocument(fullPath.c_str());
		if (!myDocument)
		{
			return false;
		}
		myDocument->LoadFile();
		//获取根元素,即Persons
		TiXmlElement *rootElement=myDocument->RootElement();
		//输出根元素名称
		cout<<rootElement->Value()<<endl;
		//获取第一个Person节点
		TiXmlElement *firstElement=rootElement->FirstChildElement();

		//获取第一个Person的name节点和age节点
		TiXmlElement *nameElement=firstElement->FirstChildElement();
		TiXmlElement *ageElement=nameElement->NextSiblingElement();

		TiXmlAttribute *idAttribute=firstElement->FirstAttribute();

		cout<<nameElement->FirstChild()->Value()<<endl;
		cout<<ageElement->FirstChild()->Value()<<endl;
		cout<<idAttribute->Value()<<endl;
		delete myDocument;
	}
	catch (exception& e)
	{
		cout<<e.what()<<endl;
		return false;
	}
	return true;

}
/*!
*  /brief 打印xml文件。
*
*  /param XmlFile xml文件全路径。
*  /return 是否成功。true为成功,false表示失败。
*/
bool paintXml(std::string XmlFile)
{
	// 定义一个TiXmlDocument类指针
	TiXmlDocument *pDoc = new TiXmlDocument();
	if (NULL==pDoc)
	{
		return false;
	}
	pDoc->LoadFile(XmlFile.c_str());
	pDoc->Print();
	delete pDoc;
	return true;
}
int main(){
	CString appPath=GetAppPath();
	string fileName="xmlDemo.xml";
	string seperator="\\";
	string fullPath=appPath.GetBuffer(0)+seperator+fileName;

	//创建
	createXMlFile(fullPath);
	//打印xml
	paintXml(fullPath);

	cout<<"读取信息如下:"<<endl;
	//读取xml
	readXml(fullPath);
	system("pause");
	return 0;
}</span>

具体代码可下载:

http://download.csdn.net/detail/woshizfs/7699843

关于TinyXMLDocument的撤销问题

自己写了一个xml读取写入的程序,new和delete本来成对使用,可是在调试过程中程序总是崩溃,出现内存泄漏问题,后来发现有个指针调用为空(C++中的陷阱就在于此)。

另一方面,却发现使用TinyXML过程中使用了好多new来创建节点。C++需要,自己管理内存。new创建的对象都保存在堆上,必须手动delete掉。可我也没做处理,开始迷惑了。

找了半天,从继承关系来看, 对于一个TinyXMLDocument对象,在析构时,会将其子节点都释放掉,它的子节点都是new出来的,也必须delete掉。但TinyXML的析构函数是空的,什么也没写,不要忘了,TinyXMLDocument是从TinyXMLNode继承而来,在TinyXMLNode的析构函数中,却清楚的写着

TiXmlNode::~TiXmlNode()

{

TiXmlNode* node = firstChild;

TiXmlNode* temp = 0;

while ( node )

{

temp = node;

node = node->next;

delete temp;

}

}

所以,doc对象释放时,会对所有已经连接进来的节点进行释放,所以不需要手动的去释放所new出来的东西。

但是,还需要注意,如果TiXmlDocument对象也是new出来的,则需要对TiXmlDocument对象执行delete,才可以触发析构函数被调用。

C++的XML解析器:TinyXML

时间: 2024-09-28 21:44:56

C++的XML解析器:TinyXML的相关文章

VC环境使用XML解析器(TinyXML)编程

我是在VC下编译运行. 1.首先下载TinyXML库的文件,这里给出链接http://prdownloads.sourceforge.net/tinyxml/tinyxml_2_3_4.zip?download 2.下载后解压这个压缩包,把所有的东西放到一个找的着的地方(比如,E:\开发库\TinyXML) 3.用Visual C++(推荐VC++.NET2003)创建一个新的工程(Win32控制台) 4.在TinyXML的目录里面找到tinystr.h, tinyxml.h, tinystr.

C/C++ XML解析器TinyXML

官方主页 http://www.grinninglizard.com/tinyxml/ TinyXML是一个开源的解析XML的解析库,能够在Windows或Linux中编译.

TinyXML:一个优秀的C++ XML解析器

1. TinyXML:一个优秀的C++ XML解析器 2. http://blog.chinaunix.net/uid-23381466-id-3360201.html

TinyXML开源XML解析器-TinyXML-2

TinyXML-2 is a simple, small, efficient, C++ XML parser that can be easily integrating into other programs. TinyXML-2 是一个简单.小型.高效的C++ XML解析器,它可以很容易地集成到其他程序. TinyXML-1 served my needs for many years; but it uses memory inefficiently, and doesn't perfo

TinyXML:一个优秀的C++ XML解析器[转]

TinyXML:一个优秀的C++ XML解析器 读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好. TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译.这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树. DOM模型即文档对象模型,是将整个文档分成多个元素(如书.章.节.段等),并

常见C/C++ XML解析器比较

常见C/C++ XML解析器有tinyxml.XERCES.squashxml.xmlite.pugxml.libxml等等,这些解析器有些是支持多语言的,有些只是单纯C/C++的.如果你是第一次接触到XML解析,那么关于XML解析器的选择问题的确令人头疼,我们先看一下这些解析器有哪些特点. 一.Xerces XML解析器 官方网址:http://xerces.apache.org/xerces-c/ Xerces前身是IBM的XML4C,XML4C也是一种功能强大的XML解析器,之后交给Apa

转:TinyXM--优秀的C++ XML解析器

读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好. TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译.这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树. DOM模型即文档对象模型,是将整个文档分成多个元素(如书.章.节.段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包

Duilib源码分析(三)XML解析器—CMarkup

上一节介绍了控件构造器CDialogBuilder,接下来将分析其XML解析器CMarkup: CMarkup:xml解析器,目前内置支持三种编码格式:UTF8.UNICODE.ASNI:CMarkupNode:xml节点类 先介绍CMarkup: XMLELEMENT: xml节点元素类型定义,iStart,节点元素在xml文件中的起始位置:iChild,节点元素子节点:iNext,节点元素的下一个节点(兄弟节点):iParent,节点元素的父节点:iData, 节点元素的数据. CMarku

XML解析器

一.操作XML文档概述 1.如何操作XML文档 XML文档也是数据的一种,对数据的操作也不外乎是"增删改查".也被大家称之为"CRUD" C:Create: R:Retrieve: U:Update: D:Delete 2.XML解析技术 XML解析方式分为两种:DOM(Document Object Model)和SAX(Simple API for XML).这两种方式不是针对Java语言来解析XML的技术,而是跨语言的解析方式.例如DOM还在Javascrip