码迷,mamicode.com
首页 > 其他好文 > 详细

tinyxml源码学习-hello world

时间:2015-07-01 12:29:47      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:tinyxml   tinyxml简单使用   tinyxml基础   

        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>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>  

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", "hdu1@hdu.com");
	PhoneBook_InsertEndChild(root, "hdu2", "hang zhou", "111", "hdu2@hdu.com");
	PhoneBook_InsertEndChild(root, "hdu3", "hang zhou", "112", "hdu3@hdu.com");

	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>hdu3@hdu.com</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>hdu1@hdu.com</email>
    </item>
    <item>
        <name>hdu2</name>
        <addr>hang zhou</addr>
        <tel>111</tel>
        <email>hdu2@hdu.com</email>
    </item>
    <item>
        <name>hdu3</name>
        <addr>hang zhou</addr>
        <tel>112</tel>
        <email>hdu3@hdu.com</email>
    </item>
</phonebook>
删除了一个item节点项和第一个item节点中name项后的phonebook.xml文件内容

< ? xml version = "1.0" ?>
<phonebook>
    <item>
        <addr>hang zhou</addr>
        <tel>110</tel>
        <email>hdu1@hdu.com</email>
    </item>
    <item>
        <name>hdu2</name>
        <addr>hang zhou</addr>
        <tel>111</tel>
        <email>hdu2@hdu.com</email>
    </item>
</phonebook>

参考资料:

        1、XML新手入门基础知识

        2、C++之tinyXML使用
        3、tinyxml源码下载地址

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

tinyxml源码学习-hello world

标签:tinyxml   tinyxml简单使用   tinyxml基础   

原文地址:http://blog.csdn.net/u012796139/article/details/46706853

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!