TinyXML2 的使用
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 的使用的更多相关文章
- TinyXML2读取和创建XML文件 分类: C/C++ 2015-03-14 13:29 94人阅读 评论(0) 收藏
TinyXML2是simple.small.efficient C++ XML文件解析库!方便易于使用,是对TinyXML的升级改写!源码见本人上传到CSDN的TinyXML2.rar资源:http: ...
- tinyxml2简单使用
引入头文件 <span style="font-size:18px;">#include "HelloWorldScene.h" #include ...
- cocos2d-x使用tinyxml2存储解析xml
我用的是2.1.4的cocos2d-x,里面自带有tinyxml2库. 导入头文件:#include "support/tinyxml2/tinyxml2.h" using nam ...
- TinyXml和tinyxml2
C++操作xml没有标准库的支持,TinyXml是个不错的xml操作库,以前总是使用TinyXml读写xml,但是最近对大量xml进行读写时,速度真的是有点慢,特别是在调试时,每次启动读xml就要好长 ...
- 7.数据本地化CCString,CCArray,CCDictionary,tinyxml2,写入UserDefault.xml文件,操作xml,解析xml
数据本地化 A CCUserDefault 系统会在默认路径cocos2d-x-2.2.3\projects\Hello\proj.win32\Debug.win32下生成一个名为UserDef ...
- 用TinyXml2读取XML文件的一个简单Demo
废话少说直接上代码,需要的人自然一看便懂,对于第一次接触TinyXml2的人来说还是有帮助的. <?xml version="1.0"?> <Table name ...
- tinyxml2库的使用--MFC工程
在编写应用程序的时候,经常需要动态加载某些数据,这种情况下微软的ini文件是蛮好的选择,但是平台的通用性比较差,使用xml的话就比较强一点,但是解析比较复杂,型号有牛人已经开发出了直接读写xml的库, ...
- TinyXML2的使用
-----------------------------------------------------------------2015年7月21日16:37:53----------------- ...
- 推荐一个优秀的c++源代码,TinyXml2
项目主页:http://grinninglizard.com/tinyxml2docs/index.html tinyxml2.h /* Original code by Lee Thomason ( ...
- Windows10 VS2017 C++ xml解析(tinyxml2库)
首先下载tinyxml2 7.0.1库: https://github.com/leethomason/tinyxml2/releases 打开tinyxml2,然后升级sdk,解决方案->重定 ...
随机推荐
- 基于tensorflow搭建一个神经网络
一,tensorflow的简介 Tensorflow是一个采用数据流图,用于数值计算的 开源软件库.节点在图中表示数字操作,图中的线 则表示在节点间相互联系的多维数据数组,即张量 它灵活的架构让你可以 ...
- 安卓工作室android studio 美化 ,设置背景图片。
作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com E-mail: 313134555 @qq.com sexy Editor 点击file-> ...
- 51nod 1277 字符串中的最大值
题目链接 51nod 1277 字符串中的最大值 题解 对于单串,考虑多串的fail树,发现next数组的关系形成树形结构 建出next树,对于每一个前缀,他出现的次数就是他子树的大小 代码 #inc ...
- BZOJ.4542.[HNOI2016]大数(莫队)
题目链接 大数除法是很麻烦的,考虑能不能将其条件化简 一段区间[l,r]|p,即num[l,r]|p,类似前缀,记后缀suf[i]表示[i,n]的这段区间代表的数字 于是有 suf[l]-suf[r+ ...
- 洛谷.3834.[模板]可持久化线段树(主席树 静态区间第k小)
题目链接 //离散化后范围1~cnt不要错 #include<cstdio> #include<cctype> #include<algorithm> //#def ...
- Python3练习题系列(06)——各种符号总结
Python3中的各种符号总结 1关键字 import keyword print(keyword.kwlist, end='\t') ['False', 'None', 'True', 'and', ...
- [HihoCoder1369]网络流一·Ford-Fulkerson算法
思路: 最大流模板. #include<queue> #include<cstdio> #include<cctype> #include<vector> ...
- node+koa2 postman 测试post请求
注意:一定要写成 “” ,否则后台一直接收不到 router.post('/form',async(ctx,next)=>{ const form1 = ctx.request.body; c ...
- “IT学子成长指导”专栏及文章目录 —贺利坚
迂者专栏关键词 就 业 大一 大二 大三 大四 自学 职 场 专业+兴趣 研究生 硕士 规 划 考 研 大学生活 迷 茫 计算机+专业 基本功 学习方法 编程 基 础 实践 读书 前 途 成 长 社团 ...
- CF733F Drivers Dissatisfaction【链剖】【最小生成树应用】
F. Drivers Dissatisfaction time limit per test 4 seconds memory limit per test 256 megabytes input s ...