TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。
DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。

在TinyXML中,根据XML的各种元素来定义了一些类:
  XmlNode:对应于DOM结构中的节点的基类,定义了节点转换,节点遍历及节点操作(增,删,查,改)

class XMLNode
{
//转换接口
virtual XMLElement* ToElement();
virtual XMLText* ToText();
virtual XMLComment* ToComment();
virtual XMLDocument* ToDocument();
virtual XMLDeclaration* ToDeclaration();
virtual XMLUnknown* ToUnknown(); const char* Value() const; //获取元素名称
void SetValue( const char* val, bool staticMem=false ); //修改元素名称 XMLNode* Parent();
bool NoChildren() const; XMLNode* FirstChild();
XMLNode* LastChild();
const XMLElement* FirstChildElement( const char* name = ) const;
const XMLElement* LastChildElement( const char* name = ) const; XMLNode* PreviousSibling();
XMLNode* NextSibling();
const XMLElement* PreviousSiblingElement( const char* name = ) const ; //获取上一个元素
const XMLElement* NextSiblingElement( const char* name = ) const; //获取下一个元素 XMLNode* InsertEndChild( XMLNode* addThis );
XMLNode* InsertFirstChild( XMLNode* addThis );
XMLNode* InsertAfterChild( XMLNode* afterThis, XMLNode* addThis ); void DeleteChildren(); //删除所有节点
void DeleteChild( XMLNode* node ); //删除指定节点
}

  XmlDeclaration:public XMLNode    对应于XML中的申明部分,即<?versiong="1.0" ?>
  XmlDocument:public XMLNode     对应于XML的整个文档,定义了XML文件(加载,保存)及创建元素(Declaration,Element,Comment,Text)的操作

class TINYXML2_LIB XMLDocument : public XMLNode
{
public:
XMLError LoadFile( const char* filename );
XMLError SaveFile( const char* filename, bool compact = false ); bool HasBOM() const; //检测是否含BOM
void SetBOM( bool useBOM ); XMLElement* RootElement() { //获取根节点元素
return FirstChildElement();
} //没有提供XMLPrinter,则输出至stdout,提供XMLPrinter则可以输出至内存或文件(见XmlPrinter操作)
void Print( XMLPrinter* streamer= ) const; XMLElement* NewElement( const char* name );
XMLComment* NewComment( const char* comment );
XMLText* NewText( const char* text );
XMLDeclaration* NewDeclaration( const char* text= );
XMLUnknown* NewUnknown( const char* text );
}

  XmlElement:public XMLNode        对应于XML的元素,封装了对元素名称和元素属性及Text操作

class TINYXML2_LIB XMLElement : public XMLNode
{
public:
const char* Name() const; //获取元素名称
void SetName( const char* str, bool staticMem=false );//设置元素名称
const char* GetText() const; //获取Text内容
void SetText( const T* text ); //设置Text内容
XMLError QueryTText( T* ival ) const; //以T类型的方式获取Text内容 //属性name存在则修改属性值,不存在则增加属性和值
const char* Attribute( const char* name, const char* value= ) const;
T TAttribute( const char* name ) const; //以T类型的方式获取属性的值
XMLError QueryTAttribute( const char* name, T* value ) const; //以T类型的方式获取属性的值
T QueryAttribute( const char* name, T* value ) const; //以T类型的方式获取属性的值
void DeleteAttribute( const char* name ); //删除属性 const XMLAttribute* FirstAttribute() const; //获取第一个属性
const XMLAttribute* FindAttribute( const char* name ) const;//查找第一个属性
}

  XmlComment:public XMLNode  对应于XML中的注释
  XmlText:public XMLNode      对应于XML的文字部分
  XmlAttribute               对应于XML中的元素的属性,定义了属性查询和修改接口

class TINYXML2_LIB XMLAttribute
{
const char* Name() const; //获取属性名称
const char* Value() const; //获取属性值 const XMLAttribute* Next() const; //获取下一个属性 int IntValue() const; //将属性值转换为int类型
unsigned UnsignedValue() const;
bool BoolValue() const;
double DoubleValue() const;
float FloatValue() const; XMLError QueryIntValue( int* value ) const; //以指定的类型获取属性值
XMLError QueryUnsignedValue( unsigned int* value ) const;
XMLError QueryBoolValue( bool* value ) const;
XMLError QueryDoubleValue( double* value ) const;
XMLError QueryFloatValue( float* value ) const; void SetAttribute( const char* value );
void SetAttribute( int value );
void SetAttribute( unsigned value );
void SetAttribute( bool value );
void SetAttribute( double value );
void SetAttribute( float value );
}

  XmlUnknown    对应于XML的未知部分
  XmlHandler        定义了针对XML节点指针判断是否为nullptr操作
  XMLPrinter         定义了XML打印操作,将XmlDocument内容打印到内存或文件,无需经XmlDocument构建简单的XML文件

XmlPrinter功能:
//1.打印到内存
XMLPrinter printer;
doc.Print(&printer);
SomeFunction(printer.CStr()); //2.打印输出到文件
XMLPrinter printer(fp);
doc.Print(&printer); //3.无需经XMLDocument创建一个简单的XML
XMLPrinter printer(fp);
printer.OpenElement("foo");
printer.PushAttribute("foo", "bar");
printer.CloseElement();

例如:

<xml version="1.0" standalone=no>
<!– Our to do list data –>
<ToDo>
<Item priority="1"> Go to the <bold>Toy store!</bold></Item>
<Item priority="2"> Do bills</Item>
</ToDo>

整个对象树:
  TiXmlDocument "demo.xml"
  TiXmlDeclaration "version=’1.0′" "standalone=no"
  TiXmlComment " Our to do list data"
  TiXmlElement "ToDo"
  TiXmlElement "Item" Attribtutes: priority = 1
  TiXmlText "Go to the "
  TiXmlElement "bold"
  TiXmlText "Toy store!"
  TiXmlElement "Item" Attributes: priority=2
  TiXmlText "Do bills"

举例:

#include <iostream>
#include <array>
#include <vector> #include "tinyxml2.h" using namespace tinyxml2; void read_xml()
{
XMLDocument doc;
doc.LoadFile("class.xml"); auto root_elec = doc.RootElement(); //等同于不指定参数的FirstChildElement()
auto root_ele_attr = root_elec->FirstAttribute(); std::cout << root_ele_attr->Name() << ":" << root_ele_attr->Value() << std::endl;
root_elec->SetAttribute("classid", ""); //键相同则覆盖,不同则增加
std::cout << root_ele_attr->Name() << ":" << root_ele_attr->Value() << std::endl; std::cout << "---------------------teacher-----------------------" << std::endl;
auto child_elec = root_elec->FirstChildElement()->FirstChildElement();
while (child_elec) {
std::cout << child_elec->Name() << ":" << child_elec->GetText();
auto sex = child_elec->IntAttribute("sex") ? "男" : "女";
auto super = child_elec->IntAttribute("super") ? "特级老师" : "普通老师";
std::cout << " " << sex << " " << super;
std::cout << std::endl; child_elec = child_elec->NextSiblingElement();
} std::cout << "---------------------student-----------------------" << std::endl;
auto student_elec = root_elec->FirstChildElement("student")->FirstChildElement();
while (student_elec) {
auto server_ele_attr = student_elec->FirstAttribute();
while (server_ele_attr) {
std::cout << server_ele_attr->Name() << ":" << server_ele_attr->Value() << " ";
server_ele_attr = server_ele_attr->Next();
} std::cout << std::endl; auto score_elec = student_elec->FirstChildElement();
while (score_elec) {
std::cout << score_elec->Name() << ":" << score_elec->GetText() << " ";
score_elec = score_elec->NextSiblingElement();
} std::cout << std::endl;
std::cout << "-----------------------------------------------" << std::endl; student_elec = student_elec->NextSiblingElement();
} //xmlhandler封装了对节点指针判断null的操作,可以安全的执行下面的操作
XMLHandle docHandle(&doc);
auto node = doc.FirstChildElement()->FirstChildElement()->FirstChildElement();
std::cout << node->Name() << " " << node->GetText() << std::endl;
} void write_xml()
{
XMLDocument doc;
auto decl_elec = doc.NewDeclaration(); //不传参会添加默认XML头信息
doc.InsertFirstChild(decl_elec); auto class_elec = doc.NewElement("class");
doc.InsertAfterChild(decl_elec, class_elec);
class_elec->SetAttribute("classid", ); auto teacher_elec = doc.NewElement("teacher");
class_elec->InsertEndChild(teacher_elec); std::array<std::string, > elec_name = { "chinese", "math" };
std::array<std::string, > teacher_name = { "张三", "李四" };
std::array<std::string, > attr_name = { "sex", "super"};
for (int i = ; i < elec_name.size(); i++) {
auto elec = doc.NewElement(elec_name[i].c_str());
elec->SetText(teacher_name[i].c_str());
teacher_elec->InsertEndChild(elec);
for (int m = ; m < attr_name.size(); m++) {
elec->SetAttribute(attr_name[i].c_str(), m);
}
} auto student_elec = doc.NewElement("student");
class_elec->InsertEndChild(student_elec); std::array<std::string, > stu_attr_name = { "name", "age", "address" };
std::vector<std::array<std::string, >> stu_attr_vec = {{ "张一", "", "北京" },{ "王二", "", "天津" },{ "谭三", "", "河北" },{ "横四", "", "广州" },{ "蒋五", "", "北京" }};
std::vector<std::array<int, >> stu_score_vec = { {, }, {, }, {, }, {, }, {, } };
for (int i = ; i < ; i++) {
auto node_elec = doc.NewElement("node");
for (int m = ; m < stu_attr_name.size(); m++) {
node_elec->SetAttribute(stu_attr_name[m].c_str(), stu_attr_vec[i][m].c_str());
} for (int n = ; n < stu_score_vec[].size(); n++) {
auto elec_name = n == ? "chinese_score" : "math_score";
auto score_node_elec = doc.NewElement(elec_name);
score_node_elec->SetText(stu_score_vec[i][n]);
node_elec->InsertEndChild(score_node_elec);
}
student_elec->InsertEndChild(node_elec);
} doc.SaveFile("class.xml");
} int main( int argc, const char ** argv )
{
write_xml();
read_xml();
}

打印输出为:

classid:176
classid:188
---------------------teacher-----------------------
chinese:张三 男 普通老师
math:李四 女 特级老师
---------------------student-----------------------
name:张一 age:15 address:北京
chinese_score:98 math_score:88
-----------------------------------------------
name:王二 age:17 address:天津
chinese_score:56 math_score:61
-----------------------------------------------
name:谭三 age:15 address:河北
chinese_score:85 math_score:76
-----------------------------------------------
name:横四 age:16 address:广州
chinese_score:91 math_score:95
-----------------------------------------------
name:蒋五 age:15 address:北京
chinese_score:77 math_score:64
-----------------------------------------------
chinese 张三

TinyXML2 的使用的更多相关文章

  1. TinyXML2读取和创建XML文件 分类: C/C++ 2015-03-14 13:29 94人阅读 评论(0) 收藏

    TinyXML2是simple.small.efficient C++ XML文件解析库!方便易于使用,是对TinyXML的升级改写!源码见本人上传到CSDN的TinyXML2.rar资源:http: ...

  2. tinyxml2简单使用

    引入头文件 <span style="font-size:18px;">#include "HelloWorldScene.h" #include ...

  3. cocos2d-x使用tinyxml2存储解析xml

    我用的是2.1.4的cocos2d-x,里面自带有tinyxml2库. 导入头文件:#include "support/tinyxml2/tinyxml2.h" using nam ...

  4. TinyXml和tinyxml2

    C++操作xml没有标准库的支持,TinyXml是个不错的xml操作库,以前总是使用TinyXml读写xml,但是最近对大量xml进行读写时,速度真的是有点慢,特别是在调试时,每次启动读xml就要好长 ...

  5. 7.数据本地化CCString,CCArray,CCDictionary,tinyxml2,写入UserDefault.xml文件,操作xml,解析xml

     数据本地化 A CCUserDefault 系统会在默认路径cocos2d-x-2.2.3\projects\Hello\proj.win32\Debug.win32下生成一个名为UserDef ...

  6. 用TinyXml2读取XML文件的一个简单Demo

    废话少说直接上代码,需要的人自然一看便懂,对于第一次接触TinyXml2的人来说还是有帮助的. <?xml version="1.0"?> <Table name ...

  7. tinyxml2库的使用--MFC工程

    在编写应用程序的时候,经常需要动态加载某些数据,这种情况下微软的ini文件是蛮好的选择,但是平台的通用性比较差,使用xml的话就比较强一点,但是解析比较复杂,型号有牛人已经开发出了直接读写xml的库, ...

  8. TinyXML2的使用

    -----------------------------------------------------------------2015年7月21日16:37:53----------------- ...

  9. 推荐一个优秀的c++源代码,TinyXml2

    项目主页:http://grinninglizard.com/tinyxml2docs/index.html tinyxml2.h /* Original code by Lee Thomason ( ...

  10. Windows10 VS2017 C++ xml解析(tinyxml2库)

    首先下载tinyxml2 7.0.1库: https://github.com/leethomason/tinyxml2/releases 打开tinyxml2,然后升级sdk,解决方案->重定 ...

随机推荐

  1. 042 将数据导入hive,将数据从hive导出

    一:将数据导入hive(六种方式) 1.从本地导入 load data local inpath 'file_path' into table tbname; 用于一般的场景. 2.从hdfs上导入数 ...

  2. 使用SQL逆向生成PDM文件

    首先导出表结构,可以使用Navicat 或者DataGrip 生成SQL文件后使用PowerDesigner 指定数据库类型,选择SQL文件即可

  3. 移动端、PC端(前后台)、小程序常用的UI框架

    1.移动端UI库 ①.Vant UI 官方地址:https://youzan.github.io/vant/#/zh-CN/intro github地址:https://github.com/youz ...

  4. 算法进阶面试题03——构造数组的MaxTree、最大子矩阵的大小、2017京东环形烽火台问题、介绍Morris遍历并实现前序/中序/后序

    接着第二课的内容和带点第三课的内容. (回顾)准备一个栈,从大到小排列,具体参考上一课.... 构造数组的MaxTree [题目] 定义二叉树如下: public class Node{ public ...

  5. grant 权限 on 数据库对象 to 用户

    grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删除 数据库中所有表数据的权利. grant select on testdb.* to common_ ...

  6. 16,EasyNetQ-群集支持

    EasyNetQ支持RabbitMQ群集,无需部署负载均衡器. 只需在连接字符串中列出群集的节点... var bus = RabbitHutch.CreateBus("host=ubunt ...

  7. bzoj 3991: [SDOI2015]寻宝游戏 虚树 set

    目录 题目链接 题解 代码 题目链接 bzoj 3991: [SDOI2015]寻宝游戏 题解 发现每次答案就是把虚树上的路径*2 接在同一关键点上的点的dfs序是相邻的 那么用set动态维护dfs序 ...

  8. BZOJ.1758.[WC2010]重建计划(分数规划 点分治 单调队列/长链剖分 线段树)

    题目链接 BZOJ 洛谷 点分治 单调队列: 二分答案,然后判断是否存在一条长度在\([L,R]\)的路径满足权值和非负.可以点分治. 对于(距当前根节点)深度为\(d\)的一条路径,可以用其它子树深 ...

  9. Python不定参数函数

    1. 元组形式 def test1(*args): print('################test1################') print(type(args)) print(arg ...

  10. iOS埋点统计

    链接: iOS无埋点数据SDK实践之路 iOS:无埋点数据SDK实践之路,看完能懂就厉害了 iOS埋点业务方案 ios 无码统计埋点 使用AOP实现iOS应用内的埋点计数 Aspects(AOP) A ...