tinyxml源码学习-hello world

tinyXml使用文档对象模型(DOM)来解析xml文件,这种模型的处理方式为在分析时,一次性的将整个XML文档进行分析,并在内存中形成对应的树结构,同时,向用户提供一系列的接口来访问和编辑该树结构。这种方式占用内存大,但可以给用户提供一个面向对象的访问接口,对用户更为友好,非常方便用户使用

想了解关于XML介绍的的童鞋请移步到:XML 新手入门基础知识 (这里讲的XML基础很清楚的^_^)

想下载tinyxml源码的童鞋请移步到:http://sourceforge.net/projects/tinyxml/

刚使用timyxml进行xml文件的解析,不得不了解一下tinyxml中的几个类及其关系,下面是tinyxml中几个主要类的关系图(引用自tinyxml文档)

想进一步了解tinyxml文档的童鞋可以查看tinyxml源码中的doc文件夹中的文档。

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>[email protected]</email>
	</item>
	<item>
		<name>gougou</name>
	<addr>Liaoning Shenyang</addr>
	<tel>15840330481</tel>
	<email>[email protected]</email>
	</item>
	<!--more contacted persons.-->
</phonebook>

l  像TiXmlDeclaration指的就是<?xml version="1.0"encoding="UTF-8"?>,

l  像TiXmlComment指的就是<!--one item behalfs onecontacted person.-->、 <!--more contacted persons.-->,

l  像TiXmlDocument指的就是整个xml文档,

l  像TiXmlElement指的就是<phonebook>、<item>、<name>、<addr>等等这些节点,

l  像TiXmlText指的就是‘gougou’、‘15840330481’这些夹在<item>与</item>、<name>与</name>、<addr>与</addr>之间的文本文字,

l  像TiXmlAttribute指的就是<?xml version="1.0"encoding="UTF-8"?>节点中version、encoding,

l  除此之外就是TiXmlUnknown。

注意

<phonebook>
……
</phonebook>

这就是一个TiXmlNode,而……就是该TiXmlNode的TiXmlElement,TiXmlElement不包括TiXmlComment(注释类,它表示文件的注释部分)

下面是简单的hello world程序(不是输出hello world哟 )

/*
 * create a new xml file, it's name is phonebook.xml
 * timyxml version: 2.6.2
 * 程序新建一个空的doc文件,然后往该文件中添加一个phonebook节点,此时doc文件的根节点就是phonebook,
 * 向根节点中添加3项联系人信息(name、addr、tel、email),然后打印出每项联系人的信息。
 * 接着删除其中一项联系人中的一条信息,比如第一项联系人的name信息,然后再删除一项联系人,接着打印出来
*/
#include <iostream>
#include <sstream>
#include "tinyxml.h"

using namespace std;

/**
 * 向root节点中插入name、addr、tel、email等节点
 */
int PhoneBook_InsertEndChild(TiXmlNode* root, char* _name = "", char* _addr = "",
							char* _tel = "", char* _email = "")
{
	if (!root)
		return -1;

	TiXmlElement* node = new TiXmlElement("item");

	TiXmlNode* name = new TiXmlElement("name");
	node->InsertEndChild(*name)->InsertEndChild(TiXmlText(_name));
	TiXmlNode* addr = new TiXmlElement("addr");
	node->InsertEndChild(*addr)->InsertEndChild(TiXmlText(_addr));
	TiXmlNode* tel = new TiXmlElement("tel");
	node->InsertEndChild(*tel)->InsertEndChild(TiXmlText(_tel));
	TiXmlNode* email = new TiXmlElement("email");
	node->InsertEndChild(*email)->InsertEndChild(TiXmlText(_email));

	/* 向root中添加该element,element中包含4个节点 */
	root->InsertEndChild(*node);

	return 0;
}

int main(void)
{
	const char* str = "< ? xml version = \"1.0\" ?>";
	TiXmlDocument doc("phonebook.xml");

	doc.Parse(str);
	TiXmlNode* phoneBook = new TiXmlElement("phonebook");
	doc.InsertEndChild(*phoneBook); /* 插入节点phonebook */

	/* 获取doc的根元素,即phonebook */
	TiXmlNode* root = doc.RootElement();

	PhoneBook_InsertEndChild(root, "hdu1", "hang zhou", "110", "[email protected]");
	PhoneBook_InsertEndChild(root, "hdu2", "hang zhou", "111", "[email protected]");
	PhoneBook_InsertEndChild(root, "hdu3", "hang zhou", "112", "[email protected]");

	doc.Print();
	cout << endl;

	/* 依次遍历item,然后输出每个item中的节点(name,addr,tel,email)信息 */
	for (TiXmlNode* item = root->FirstChild(); item; item = item->NextSibling("item"))
	{
		cout << "-----------------------------" << endl;
		for (TiXmlElement* element = item->FirstChildElement(); element; element = element->NextSiblingElement())
		{
			if (!strcmp(element->Value(), "name"))
				cout << "name: " << (element->GetText() ? element->GetText() : "") << endl;
			else if (!strcmp(element->Value(), "addr"))
				cout << "addr: " << (element->GetText() ? element->GetText() : "") << endl;
			else if (!strcmp(element->Value(), "tel"))
				cout << "tel: " << (element->GetText() ? element->GetText() : "") << endl;
			else if (!strcmp(element->Value(), "email"))
				cout << "email: " << (element->GetText() ? element->GetText() : "") << endl;
			else
				cout << "I don't know" << endl;
		}
	}
	//doc.SaveFile(); /* 取消注释后会该doc保存为phonebook.xml文件 */

	TiXmlElement* element = root->FirstChild()->FirstChildElement();
	root->FirstChild()->RemoveChild(element); /* 删除了第一项item节点中的 <name>hdu1</name> 节点 */

	TiXmlNode* node = root->LastChild();
	root->RemoveChild(node);   /* 删除了节点<item>
											<name>hdu3</name>
											<addr>hang zhou</addr>
											<tel>112</tel>
											<email>[email protected]</email>
											</item> */

	doc.Print();
	cout << endl;

	for (TiXmlNode* item = root->FirstChild(); item; item = item->NextSibling("item"))
	{
		cout << "-----------------------------" << endl;
		for (TiXmlElement* element = item->FirstChildElement(); element; element = element->NextSiblingElement())
		{
			if (!strcmp(element->Value(), "name"))
				cout << "name: " << (element->GetText() ? element->GetText() : "") << endl;
			else if (!strcmp(element->Value(), "addr"))
				cout << "addr: " << (element->GetText() ? element->GetText() : "") << endl;
			else if (!strcmp(element->Value(), "tel"))
				cout << "tel: " << (element->GetText() ? element->GetText() : "") << endl;
			else if (!strcmp(element->Value(), "email"))
				cout << "email: " << (element->GetText() ? element->GetText() : "") << endl;
			else
				cout << "I don't know" << endl;
		}
	}

	return 0;
}

在没有删除任何元素时,phonebook.xml文件内容为:

< ? xml version = "1.0" ?>
<phonebook>
    <item>
        <name>hdu1</name>
        <addr>hang zhou</addr>
        <tel>110</tel>
        <email>[email protected]</email>
    </item>
    <item>
        <name>hdu2</name>
        <addr>hang zhou</addr>
        <tel>111</tel>
        <email>[email protected]</email>
    </item>
    <item>
        <name>hdu3</name>
        <addr>hang zhou</addr>
        <tel>112</tel>
        <email>[email protected]</email>
    </item>
</phonebook>

删除了一个item节点项和第一个item节点中name项后的phonebook.xml文件内容

< ? xml version = "1.0" ?>
<phonebook>
    <item>
        <addr>hang zhou</addr>
        <tel>110</tel>
        <email>h[email protected]</email>
    </item>
    <item>
        <name>hdu2</name>
        <addr>hang zhou</addr>
        <tel>111</tel>
        <email>[email protected]</email>
    </item>
</phonebook>

参考资料:

1、XML新手入门基础知识

2、C++之tinyXML使用

3、tinyxml源码下载地址

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-16 19:17:22

tinyxml源码学习-hello world的相关文章

FireMonkey 源码学习(5)

(5)UpdateCharRec 该函数的源码分析如下: procedure TTextLayoutNG.UpdateCharRec(const ACanvas: TCanvas; NeedBitmap: Boolean; var NewRec: PCharRec; HasItem: Boolean; const CharDic: TCharDic; const AFont: TFont; const Ch: UCS4Char; const NeedPath: Boolean = False);

jquery源码学习

jQuery 源码学习是对js的能力提升很有帮助的一个方法,废话不说,我们来开始学习啦 我们学习的源码是jquery-2.0.3已经不支持IE6,7,8了,因为可以少学很多hack和兼容的方法. jquery-2.0.3的代码结构如下 首先最外层为一个闭包, 代码执行的最后一句为window.$ = window.jquery = jquery 让闭包中的变量暴露倒全局中. 传参传入window是为了便于压缩 传入undefined是为了undifined被修改,他是window的属性,可以被修

Hadoop源码学习笔记(1) ——第二季开始——找到Main函数及读一读Configure类

Hadoop源码学习笔记(1) ——找到Main函数及读一读Configure类 前面在第一季中,我们简单地研究了下Hadoop是什么,怎么用.在这开源的大牛作品的诱惑下,接下来我们要研究一下它是如何实现的. 提前申明,本人是一直搞.net的,对java略为生疏,所以在学习该作品时,会时不时插入对java的学习,到时也会摆一些上来,包括一下设计模式之类的.欢迎高手指正. 整个学习过程,我们主要通过eclipse来学习,之前已经讲过如何在eclipse中搭建调试环境,这里就不多述了. 在之前源码初

HSQLDB源码学习——数据库安装启动及JDBC连接

HSQLDB 是一个轻量级的纯Java开发的开放源代码的关系数据库系统.因为HSQLDB的轻量(占用空间小),使用简单,支持内存运行方式等特点,HSQLDB被广泛用于开发环境和某些中小型系统中. 在http://sourceforge.net/projects/hsqldb/files/下载了HSQLDB 1.8.0版本.把下载的zip文件解压缩至任意目录例如c:\hsqldb1.8便完成安装. hsqldb有四种运行模式: 一.内存(Memory-Only)模式:所有数据都在内存里操作.应用程

lodash源码学习(10)

_.delay(func, wait, [args]) 延迟wait毫秒之后调用该函数,添加的参数为函数调用时的参数 //delay.js var baseDelay = require('./_baseDelay'),//baseDelay方法 baseRest = require('./_baseRest'),//创建使用rest参数方法 toNumber = require('./toNumber');//转化为数字 /** * * @param {Function} func 需要延迟执

lodash源码学习(2)

继续学习lodash,依然是数组的方法 “Array” Methods _.indexOf(array, value, [fromIndex=0]) 获取value在数组 array所在的索引值 使用 SameValueZero方式比较(第一个全等===的元素). 如果 fromIndex 值是负数, 则从array末尾起算 该方法依赖于strictIndexOf和baseIndexOf方法,先看它们的源码 //_strictIndexOf.js /** * _.indexOf的专业版本,对元素

jQuery源码学习感想

还记得去年(2015)九月份的时候,作为一个大四的学生去参加美团霸面,结果被美团技术总监教育了一番,那次问了我很多jQuery源码的知识点,以前虽然喜欢研究框架,但水平还不足够来研究jQuery源码,那时我不明白他们为何要求那么高,现在才知道,原来没那么高,他问的都是jQuery最基本的框架架构,不过对于不知道的来说,再简单我也是不知道,那时写了一篇博文去吐槽了一下,那时候也是我自己真正激发自己的时候,那时候我说我一定要搞好自己的jQuery基础,没想到那么快就实现了,一个月的源码学习时间就结束

Redis源码学习-Lua脚本

Redis源码学习-Lua脚本 1.Sublime Text配置 我是在Win7下,用Sublime Text + Cygwin开发的,配置方法请参考<Sublime Text 3下C/C++开发环境搭建>. 要注意的是:在Cygwin中安装Lua解析器后,SublimeClang插件就能识别出可饮用的Lua头文件了,因为Build System中我们已经配置过"-I", "D:\\cygwin64\\usr\\include",而新安装的Lua头文件会

tomcat源码学习(2)&#160;&#160;关于apache&#160;digest

好久不写博文,罪过罪过.因为最近公司比较忙加上琐事有点多,所以隔了好久才来更新博文. apache digest本来是struts2框架中来加载xml文件并实例化对象的一个jar包,后来使用的越来越多. 我们都知道tomcat的conf文件夹下有一个server.xml配置文件,我们经常会其中的来进行配置以来运行一个java web项目,也经常修改中的port属性以来实现修改tomcat监听的端口.其实每个标签基本上都对应着一个对象,那tomcat是如何将这些对象实例化到java 虚拟机的运行内