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,解决方案->重定 ...
随机推荐
- python套接字编程实现ntp服务和远程命令执行
python套接字编程实现ntp服务和远程命令执行 目录 基于udp实现ntp服务 基于tcp实现远程命令执行 基于udp实现远程命令执行 tcp与udp的比较 前面关于套接字基础请查阅 https: ...
- P2376 [USACO09OCT]津贴Allowance
P2376 [USACO09OCT]津贴Allowance一开始想的是多重背包,但是实践不了.实际是贪心,让多c尽可能少,所以先放大的,最后让小的来弥补. #include<iostream&g ...
- HQL count(*)
public int getTarPage() { String hql = "'"; Query query = getSession().creat ...
- Thread中的一些方法
Thread中的一些方法: currentThread() 返回对当前正在执行的线程对象的引用(实现接口方式时使用). sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠( ...
- SQL try
BEGIN TRY -- Generate a constraint violation error. DELETE FROM Production.Product ; END TRY BEGIN C ...
- Wamp修改端口
WAMP装好之后默认的端口是80,但是这个80端口呢,可以热门端口啊,迅雷,IIS都挺喜欢,在WIN7下本来还有1个进程也点80,让人伤脑筋啊,所以把它改掉,方法如下: 一.修改APACHE的监听端口 ...
- 使用boost线程定时器作为后台线程来切换主循环程序状态方法2
上一篇的方法主要使用的是:通过线程延时实 现的定时,并且只能定时一次,如果需要对此定时处理,就需要使用下面的定时器: #include "stdafx.h" #include &l ...
- window10 还原精灵 破解版 冰点
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha=======
- gradle 汉化
作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com E-mail: 313134555 @qq.com gradle 汉化 android stud ...
- 洛谷P2982 [USACO10FEB]慢下来Slowing down(线段树 DFS序 区间增减 单点查询)
To 洛谷.2982 慢下来Slowing down 题目描述 Every day each of Farmer John's N (1 <= N <= 100,000) cows con ...