标签: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(注释类,它表示文件的注释部分)
)/*
* 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>
2、C++之tinyXML使用
3、tinyxml源码下载地址
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:tinyxml tinyxml简单使用 tinyxml基础
原文地址:http://blog.csdn.net/u012796139/article/details/46706853