tinyxml源码学习-hello world

来源:互联网 发布:卡梅隆安东尼数据 编辑:程序博客网 时间:2024/06/03 13:05

        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;elsecout << "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;elsecout << "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源码下载地址

0 0