`
Qaohao
  • 浏览: 261650 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

C++之tinyXML使用

阅读更多
    tinyXML一款很优秀的操作C++类库,文件不大,但方法很丰富,和apache的Dom4j可以披靡啊!习惯了使用java类库的我看到这么丰富的c++类库,很高兴!它使用很简单,只需要拷贝几个文件到你的工程中,没有STL也可以编译运行。
   
    下面我从这几个方面谈谈对tinyXML类库的使用以及理解。

    首先在sourceforge上下载tinyXML类库,地址:http://sourceforge.net/projects/tinyxml/

    然后解压缩tinyXML后,将这六个文件添加到你的c++工程中,分别是tinystr.h、tinystr.cpp、tinyxml.h、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp。在需要操作xml文件的地方,使用如下代码,就可以引入tinyXML类库。
#include<tinyxml>

或者
#include "tinyxml.h"


    下面我用个简单的例子说明如何使用tinyXML操作xml文件。在讲例子之前我先说说tinyXML中主要类和xml文档之间的对应关系。下面是tinyXML中主要class的类图,反应各个类之间的静态关系。

引用来自tinyXML文档

    TiXmlBase是所有类的基类,TiXmlNode、TiXmlAttribute两个类都继承来自TiXmlBase类,其中TiXmlNode类指的是所有被<...>...<.../>包括的内容,而xml中的节点又具体分为以下几方面内容,分别是声明、注释、节点以及节点间的文本,因此在TiXmlNode的基础上又衍生出这几个类TiXmlComment、TiXmlDeclaration、TiXmlDocument、TiXmlElement、TiXmlText、TiXmlUnknown,分别用来指明具体是xml中的哪一部分。TiXmlAttribute类不同于TiXmlNode,它指的是在尖括号里面的内容,像<... ***=...>,其中***就是一个属性。这块我具体用一个xml文档说明一下,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<phonebook>
    <!--one item behalfs one contacted person.-->
    <item>
    	<name>miaomaio</name>
	<addr>Shaanxi Xi'an</addr>
	<tel>13759911917</tel>
	<email>miaomiao@home.com</email>
    </item>
    <item>
    	<name>gougou</name>
	<addr>Liaoning Shenyang</addr>
	<tel>15840330481</tel>
	<email>gougou@home.com</email>
    </item>
    <!--more contacted persons.-->
</phonebook>

  • 像TiXmlDeclaration指的就是<?xml version="1.0" encoding="UTF-8"?>,
  • 像TiXmlComment指的就是<!--one item behalfs one contacted person.-->、 <!--more contacted persons.-->,
  • 像TiXmlDocument指的就是整个xml文档,
  • 像TiXmlElement指的就是<phonebook>、<item>、<name>、<addr>等等这些节点,
  • 像TiXmlText指的就是‘gougou’、‘15840330481’这些夹在<item>与</item>、<name>与</name>、<addr>与</addr>之间的文本文字,
  • 像TiXmlAttribute指的就是<?xml version="1.0" encoding="UTF-8"?>节点中version、encoding,
  • 除此之外就是TiXmlUnknown。


下面是我自己写的一段读xml文件的c++代码,以及再往xml写入一个item的源代码,其中phonebookdata.xml中的内容就是上面xml,仅供参考。
	//______________________________________________________________________
	// Read information from xml file.
	
	// define xml file path, as follow , we use relative path,
	// but you can use absolute path also.
	const char* filepath = "phonebookdata.xml";
	TiXmlDocument doc(filepath);
	bool loadOkay = doc.LoadFile();
	// faile to load 'phonebookdata.xml'.
	if (!loadOkay) {	
		printf( "Could not load test file %s. Error='%s'. Exiting.\n", filepath,doc.ErrorDesc() );
		exit( 1 );
	}
	
	// get dom root of 'phonebookdata.xml', here root should be 'phonebook'.
	TiXmlElement* root = doc.RootElement();
	
	printf("_______________________________________\n\n");
	printf("     contacted person information      \n\n");
	// trace every items below root.
	for( TiXmlNode*  item = root->FirstChild( "item" );
			 item;
			 item = item->NextSibling( "item" ) ) {
		printf("_______________________________________\n");

		// read name.
		TiXmlNode* child = item->FirstChild();
		const char* name = child->ToElement()->GetText();
		if (name) {
			printf("name:%s\n",name);
		} else {
			printf("name:\n");
		}

		// read address.
		child = item->IterateChildren(child);
		const char* addr = child->ToElement()->GetText();
		if (addr) {
			printf("addr:%s\n",addr);
		} else {
			printf("addr:\n");
		}


		// read telephone no.
		child = item->IterateChildren(child);
		const char* tel = child->ToElement()->GetText();
     	if (tel) {
			printf("tel:%s\n",tel);
		} else {
			printf("tel:\n");
		}

		// read e-mail.
		child = item->IterateChildren(child);
		const char* email = child->ToElement()->GetText();
		if(email) {
			printf("email:%s\n",email);
		} else {
			printf("email:\n");
		}
		
		printf("\n");
	
	}
	//______________________________________________________________________
	

	//______________________________________________________________________
	// Add information to xml file and save it.
	TiXmlElement* writeRoot = doc.RootElement();
	TiXmlNode* newNode = new TiXmlElement("item");

    const TiXmlNode* name4NewNode = new TiXmlElement("name");
	newNode->InsertEndChild(*name4NewNode)->InsertEndChild(TiXmlText("pipi"));
	
	const TiXmlNode* addr4NewNode = new TiXmlElement("addr");
	newNode->InsertEndChild(*addr4NewNode)->InsertEndChild(TiXmlText("Shaanxi Xianyang"));

	const TiXmlNode* tel4NewNode = new TiXmlElement("tel");
	newNode->InsertEndChild(*tel4NewNode)->InsertEndChild(TiXmlText("02937310627"));
	
	const TiXmlNode* email4NewNode = new TiXmlElement("email");
	newNode->InsertEndChild(*email4NewNode)->InsertEndChild(TiXmlText("pipi@home.com"));
	
	writeRoot->InsertEndChild(*newNode);
	doc.SaveFile();
	//______________________________________________________________________


具体使用可以参考tinyxml随带的文档。
  • 大小: 1.4 KB
分享到:
评论
1 楼 语儿123 2014-06-10  

相关推荐

    C/C++使用tinyxml读写XML文档

    内附样例程序,不过最好还是到网上搜搜其他人的例子(PS:如果你不想看源码的话),网上发部的例子都是new了xmldocumen对象,(添加的元素节点都是以new的方式)却没有释放,这个只要在xmldocument使用后,...

    C++ XML文件解析库 tinyxml2

    TinyXML2因其小巧、高效和易于使用的特点,成为许多C++开发者的首选XML解析库。在实际应用中,可以根据具体需求选择是否使用TinyXML2提供的高级特性,如内存池管理和异步解析,以进一步优化性能。总的来说,无论你是...

    TinyXML2使用示例

    在“TinyXML2使用示例”中,我们可以通过提供的源代码和XML配置文件来了解如何使用TinyXML2进行XML操作。 首先,`CXMLCfg.cpp`、`CXMLCfg.h`文件很可能包含了TinyXML2的封装类或函数,用于简化XML文档的读取和写入...

    C++ 使用TinyXML解析XML文件 源码

    下面我们将详细探讨如何在C++中使用TinyXML来解析XML文件: 1. **TinyXML的安装与集成**: 在项目中使用TinyXML,首先需要下载TinyXML库,将其包含的头文件(如"tinyxml.h")和源文件(如"tinyxml.cpp")添加到...

    tinyxml与tinyxml2

    如果对C++11特性支持不是必需的,且更倾向于使用已有的TinyXML代码,那么TinyXML也可以满足基本需求。 在使用这些库时,记得包含相应的头文件,如`tinyxml.h`和`tinyxml2.h`,并链接相应的库。同时,由于它们都是...

    C++通过TinyXML类库读写XML文件示例代码

    本示例将详细讲解如何使用TinyXML库在C++中实现XML文件的读写操作。首先,确保你已经下载并包含了TinyXML库的头文件`tinyxml.h`和`tinyxml.cpp`。接下来,我们将分步骤介绍基本用法。 1. **解析XML文件** 要读取...

    tinyxml2.h tinyxml2.cpp文件

    TinyXML-2,通常以tinyxml2库的形式存在,是一个轻量级的C++库,专门用于解析和操作XML文档。这个库由李·斯坦普(Lee Stemp)开发,设计简洁,易于集成到各种项目中,特别是对于嵌入式系统和资源有限的环境。在给定...

    XML解析工具- TinyXML2 -源代码 - C++

    TinyXML-2 是一个简单、小型、高效的 C++ XML 解析器,可以被轻松集成到其他程序中。它使用文档对象模型(DOM)的方式解析XML,可解析 XML 文档,并根据该文档构建可读取、修改和保存的文档对象模型。 作为XML解析...

    c++用tinyxml库操作xml

    在这个名为“c++用tinyxml库操作xml”的项目中,我们可以通过VS2010这个IDE来编译和运行代码,学习如何使用TinyXML进行XML文件的读写操作。 首先,让我们深入了解TinyXML库。TinyXML库提供了一套直观的C++类,这些...

    使用C++封装tinyxml,读取xml文件

    本文将深入探讨如何使用C++封装TinyXML,以便更高效地读取XML文件。 首先,我们需要理解TinyXML的基本结构。TinyXML提供了几个主要类,如`TiXmlDocument`、`TiXmlElement`、`TiXmlAttribute`和`TiXmlText`等。`...

    tinyxml2 version 9.0.0下载地址

    TinyXML2是一个小型、快速且易于使用的XML解析库,主要用于C++编程。版本9.0.0是该库的一个更新版本,提供了最新的功能和错误修复。在这个版本中,开发者可以期待更加稳定和优化的XML处理性能。 TinyXML2的设计目标...

    C++ XML 解析之 TinyXML

    TinyXML 是一个轻量级的开源 XML 解析库,专为 C++ 设计,可以在 Windows 和 Linux 平台上编译。它提供了简单的 API,使得 XML 文档解析变得容易上手。TinyXML 将 XML 文件解析成内存中的 DOM(文档对象模型)结构,...

    C++ XML解析之TinyXML篇

    C++ XML解析之TinyXML篇

    C++使用tinyxml解析xml的demo

    在C++编程中,处理XML文件通常需要借助第三方库,其中TinyXML是一个轻量级、易于使用的库,专门用于解析和操作XML文档。本文将详细介绍如何在C++中使用TinyXML库来解析XML文件,并通过一个具体的示例“test100”来...

    tinyxml2解析和创建xml样例

    TinyXML2是一个小型、快速且易于使用的C++库,用于解析和生成XML文档。这个库的设计目标是简单、高效,并且适用于嵌入式系统。在本文中,我们将深入探讨如何使用TinyXML2来解析和创建XML文件,特别是涉及到CDATA区段...

    xml c++ tinyxml xml读写 日志记录 vc mfc

    TinyXML是一个轻量级的C++库,用于解析和生成XML文档,非常适合嵌入式系统或对内存和性能要求严格的项目。 在C++中处理XML, TinyXML提供了简洁的API,使得XML的读写变得相对简单。TinyXML库主要包括几个主要类:...

    QT使用TinyXML开源库解析XML文件

    QT框架是广受欢迎的开源C++开发平台,用于构建跨平台的应用程序,而TinyXML则是一个小巧、轻量级的开源库,专门用于解析和操作XML文档。在QT项目中集成TinyXML,可以方便地处理XML数据,尤其适用于那些需要读取、...

    tinyxml解析工具修复内存泄漏

    这个tinyxml是在部门产品应用过程中发现存在内存泄漏的问题,通过代码分析,解决了在xml使用结束时,内存清理不彻底而导致的内存泄漏问题。电驴源码中使用的tinyxml也存在这个问题。不知最新版有没有修复。

    基于tinyxml2的xml操作库再封装

    TinyXML2是轻量级的C++ XML解析库,它提供了简单、直接的方式来读写XML文档。本项目是基于tinyxml2进行的二次封装,旨在进一步简化XML的操作,提供更友好的API,提升开发效率。 在C++中,原始的tinyxml2库可能需要...

Global site tag (gtag.js) - Google Analytics