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>
参考资料:
版权声明:本文为博主原创文章,未经博主允许不得转载。