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,解决方案->重定 ...
随机推荐
- linux SSH免密码登录远程服务器
背景:无密码登录,所谓的无密码登录其实是指通过证书认证的方式登录,使用一种‘公私钥’认证的方式来进行ssh登录 在linux系统中,ssh是远程登录的默认工具,因为该工具的协议使用了RSA/DSA的加 ...
- 虚拟机克隆后导致两台机器的IP都不显示的解决方法
centos7中输入ifconfig出现ens33,没有eth0,也没有ip,不能上网,输入ifconfig后如下图 之前在网上也找了很多的方法,比如删除文件70-persistent-ipoib.r ...
- 断言(assert)
断言(assert):用来调试.测试代码. 格式: assert 布尔表达式: 字符串 (如果布尔表达式为false时,这个字符串才会显示). 注意: assert默认是关闭的,使用时需要使用&quo ...
- SQLite中的FROM子句
SQLite中的FROM子句 FROM子句从数据库中可以获取到一个或多个源表.源表通常是数据库命名的表,但也可以是视图或子查询.子查询相关的更多详细信息,我们会在后面进行介绍.当获取到多个源表时,JO ...
- dns 安全
域名系统组织架构 DNS是全球互联网中最重要的基础服务之一,也是如今唯一的一种有中心点的服务.全球域名系统组织与管理架构如下图所示: ICANN 互联网名称与数字地址分配机构(The Interne ...
- AJAX请求状态码返回200却跳到error的function
最近在搞公司的项目时,发现了一个神奇的问题,就是AJAX请求成功,却莫名其妙的不返回到success函数中,而是跳到了error函数中.公司的项目是ASP.NET,这个和用的什么语言没有多大关系,只要 ...
- 2、函数y=f(x)
/* Note:Your choice is C IDE */ #include "stdio.h" /* 3.函数y=f(x)可表示为: */ void main() { int ...
- Linux进程优先级系统——设置实时进程优先级
前言 最近研发的产品出了点小bug,最后查到根本原因是,其中一个进程A使用基于FIFO的实时进程优先级,而另一个进程B是使用普通调度的进程优先级,而A和B两个进程是互相通信的,进程B会被饿死,而进程A ...
- Windows平台交叉编译Arm Linux平台的QT5.7库
1.准备交叉编译环境 环境说明:Windows 7 64位 此过程需要: (1)Qt库开源代码,我使用的是5.7.0版本: (2)Perl语言环境5.12版本以上: (3)Python语言环境 2.7 ...
- How determine the RC time constant in PWM DAC low-pass filter?
how determine the RC time constant in PWM digital to analog low-pass filter? I 'm looking for the be ...