横岗做网站公司,大庆市最新公告,wordpress毕设,wordpress站点标题美化转自#xff1a;TinyXML2 入门教程_恋喵大鲤鱼的博客-CSDN博客_tinyxml2中文指南
代码编译运行环境#xff1a;Linux 64bits Debug g -m64#xff08;-m 表示生成 64bits 的程序#xff09; 文章目录
1.TinyXML2 概述2. TinyXML1 与 TinyXML2 对比3. TinyXML2 用法用例…转自TinyXML2 入门教程_恋喵大鲤鱼的博客-CSDN博客_tinyxml2中文指南
代码编译运行环境Linux 64bits Debug g -m64-m 表示生成 64bits 的程序 文章目录
1.TinyXML2 概述2. TinyXML1 与 TinyXML2 对比3. TinyXML2 用法用例 3.1 创建 XML 文件3.2 增加 XML 文件的节点3.3 查询 XML 文件的指定节点3.4 修改 XML 文件的指定节点3.5 删除 XML 文件的指定节点内容4.其它常见用例 4.1 获取 XML 文件申明4.2 打印 XML 文件至标准输出4.3 XML 文件内容输出至内存参考文献1.TinyXML2 概述
TinyXML2 是 simple、small、efficient 的开源 C XML 文件解析库可以很方便地应用到现有的项目中。
TinyXML2 详细介绍与源码获取详见TinyXML2 官网。
2. TinyXML1 与 TinyXML2 对比
TinyXML1 与 TinyXML2 这两个著名的开源 XML 文件解析库均出自 Lee Thomason 之手让我们向这位满怀开源精神的大家致敬。
TinyXML1 开发已经停止所有的开发都转移到了 TinyXML2。TinyXML2 适用于大部分 C/C 的项目经得住考验是最好的选择。较 TinyXML1 而言TinyXML2 化繁为简使用时只需要包含两个文件而 TinyXML1 需要包含 6 个文件一般生成静态链接库供项目使用。TinyXML1 详细介绍与源码见TinyXML1官网。TinyXML1 用法用例可以参考博文TinyXML快速入门。
TinyXML2 使用了与 TinyXML1 相似的 API并且拥有丰富的测试案例。但 TinyXML2 解析器相对 TinyXML1 在代码上是完全重写使其更适合于游戏开发。它使用更少的内存效率更高。
TinyXML2 无需 STL也放弃了对 STL 支持。所有字符串查询均使用 C 风格字符串const char*来表示省去 string 类型对象的构造使代码更加简洁。
二者共同点 1都使用了简单易用的 API。 2都是基于 DOMDocument Object Model文档对象模型的解析器。 3都支持 UTF-8 编码。
TinyXML2 的优点 1对大部分大部分的 C/C 项目具有普适性 2使用较少的内存约 TinyXML1 的 40%速度更快 3没有 C 的 STL 的要求 4更接近现代 C 的特性如使用了适当的命名空间 5适当有效的处理了的空白字符空格Tab 和回车。
TinyXML1 的优点 1可以报告分析错误的位置 2提供一些 C STL 公约支持流和字符串 3拥有非常成熟和良好的调试代码库。
3. TinyXML2 用法用例
TinyXML2 的网上教程并不多见醍醐灌顶、受益匪浅的教程更是凤毛麟角。有的也是蜻蜓点水、参差不齐的泛泛而谈。最终所能参考的资料也就是官网文档和示例代码但却有点晦涩难懂。因此本文就为了解决这个尴尬的局面结合官网资料和网上资源尽量详细地列出 TinyXML2 的常见用法用例不足之处请留言补充后续增加修改。
XML 文件本质就是小型的数据库换个角度来说就是对数据库有什么操作那么对 XML 文件就应能实现什么操作。一般而言对数据库的操作包括以下几种新建数据库和对数据库增删查改。那么对应 XML 文件就是新建 XML 文件、增加 XML 文件的节点删除XML文件的指定节点查询 XML 文件指定节点的值修改 XML 文件节点的值。
使用方法将 tinyxml2.cpp 和 tinyxml2.h 拷贝至项目目录使用时包含头文件和引入名字空间。
#include tinyxml2.h
using namespace tinyxml2使用场景存储用户信息。
用户数据表设计如下
变量名描述类型长度字节不为空主键UserName用户名Vchar3-20YYPassword密码Char32YNGender性别Int1NNMobile电话Char11NNEmail电子邮箱Varchar1-50NN
对应 XML 文件实现如下
?xml version1.0 encodingUTF-8 standaloneno?
DBUSERUser Name”lvlv” Password ”123456”Gender/GenderMobile / MobileEmail / Email /User!-- This is a comment --
DBUSER从中可以看出XML 由三大部分组成分别是声明、根节点和其它节点。其中 XML 文件的声明包括三方面的内容Version、Standalone 和 Encoding。下面将详细列出常见 TinyXML2 的用法。
注意以下示例代码针对本人下载使用的 TinyXML2官网的 TinyXML2 在不断地完善和更新当中最新的 TinyXML2 和本文的示例代码可能会有出入。本人使用的 TinyXML2 是 2015.9.23 从官网下载的已上传至 CSDN下载见TinyXML2。
3.1 创建 XML 文件
示例代码
//functioncreate a xml file
//paramxmlPath:xml文件路径
//return0,成功非0失败
int createXML(const char* xmlPath)
{const char* declaration ?xml version\1.0\ encoding\UTF-8\ standalone\no\?;XMLDocument doc;doc.Parse(declaration);//会覆盖xml所有内容//添加申明可以使用如下两行//XMLDeclaration* declarationdoc.NewDeclaration();//doc.InsertFirstChild(declaration);XMLElement* rootdoc.NewElement(DBUSER);doc.InsertEndChild(root);return doc.SaveFile(xmlPath);
}创建结果
?xml version1.0 encodingUTF-8 standaloneno?
DBUSER/3.2 增加 XML 文件的节点
示例代码
//用户类
class User
{
public:User(){gender0;};User(const string userName, const string password, int gender, const string mobile, const string email){this-userNameuserName;this-passwordpassword;this-gendergender;this-mobilemobile;this-emailemail;};string userName;string password;int gender;string mobile;string email;
};//functioninsert XML node
//paramxmlPath xml 文件路径; user 用户对象
//return0 成功; 非 0 失败
int insertXMLNode(const char* xmlPath,const User user) {XMLDocument doc;int resdoc.LoadFile(xmlPath);if(res!0){coutload xml file failedendl;return res;}XMLElement* rootdoc.RootElement();XMLElement* userNode doc.NewElement(User);userNode-SetAttribute(Name, user.userName.c_str());userNode-SetAttribute(Password, user.password.c_str());root-InsertEndChild(userNode);XMLElement* gender doc.NewElement(Gender);XMLText* genderTextdoc.NewText(itoa(user.gender));gender-InsertEndChild(genderText);userNode-InsertEndChild(gender);XMLElement* mobile doc.NewElement(Mobile);mobile-InsertEndChild(doc.NewText(user.mobile.c_str()));userNode-InsertEndChild(mobile);XMLElement* email doc.NewElement(Email);email-InsertEndChild(doc.NewText(user.email.c_str()));userNode-InsertEndChild(email);return doc.SaveFile(xmlPath);
}创建结果
?xml version1.0 encodingUTF-8 standaloneno?
DBUSERUser Namelvlv Password 123456Gender1/GenderMobile15813354926/MobileEmail1589276509qq.com/Email/User
/DBUSER3.3 查询 XML 文件的指定节点
Xml文件中一个用户节点存储一个用户的信息。因此对用户信息的增删查改即无论查询节点、删除节点、修改节点和增加节点都需要获取需要操作的节点。那么先实现一个根据用户名获取节点指针的函数
//function:根据用户名获取用户节点
//param:root:xml文件根节点userName用户名
//return用户节点
XMLElement* queryUserNodeByName(XMLElement* root,const string userName) {XMLElement* userNoderoot-FirstChildElement(User);while(userNode!NULL) {if(userNode-Attribute(Name)userName)break;userNodeuserNode-NextSiblingElement();//下一个兄弟节点}return userNode;
}在以上函数的基础上获取用户信息的函数
User* queryUserByName(const char* xmlPath,const string userName) {XMLDocument doc;if(doc.LoadFile(xmlPath)!0) {coutload xml file failedendl;return NULL;}XMLElement* rootdoc.RootElement();XMLElement* userNodequeryUserNodeByName(root,userName);if(userNode!NULL) { //searched successfully User* usernew User();user-userNameuserName;user-passworduserNode-Attribute(Password);XMLElement* genderNodeuserNode-FirstChildElement(Gender);user-genderatoi(genderNode-GetText());XMLElement* mobileNodeuserNode-FirstChildElement(Mobile);user-mobilemobileNode-GetText(); XMLElement* emailNodeuserNode-FirstChildElement(Email);user-emailemailNode-GetText(); return user;}return NULL;
}3.4 修改 XML 文件的指定节点
//function:修改指定节点内容
//param:xmlPath:xml文件路径user用户对象
//returnbool
bool updateUser(const char* xmlPath,User* user) {XMLDocument doc;if(doc.LoadFile(xmlPath)!0) {coutload xml file failedendl;return false;}XMLElement* rootdoc.RootElement();XMLElement* userNodequeryUserNodeByName(root,user-userName);if(userNode!NULL) {if(user-password!userNode-Attribute(Password)) {userNode-SetAttribute(Password,user-password.c_str()); //修改属性}XMLElement* genderNodeuserNode-FirstChildElement(Gender);if(user-gender!atoi(genderNode-GetText())) {genderNode-SetText(itoa(user-gender).c_str()); //修改节点内容}XMLElement* mobileNodeuserNode-FirstChildElement(Mobile);if(user-mobile!mobileNode-GetText()) {mobileNode-SetText(user-mobile.c_str());}XMLElement* emailNodeuserNode-FirstChildElement(Email);if(user-email!emailNode-GetText()) {emailNode-SetText(user-email.c_str());}if(doc.SaveFile(xmlPath)0)return true;}return false;
}验证代码
int main(int argc,char* argv[]) {//修改用户信息User user(lvlv,00001111,0,13995648666,1586666qq.com);if(updateUser(./user.xml,user))coutupdate successfullyendl;elsecoutupdate failedendl;return 0;
}修改结果
?xml version1.0 encodingUTF-8 standaloneno?
DBUSERUser Namelvlv Password00001111Gender0/GenderMobile13995648666/MobileEmail1586666qq.com/Email
/User
/DBUSER3.5 删除 XML 文件的指定节点内容
//function:删除指定节点内容
//param:xmlPath:xml文件路径userName用户名称
//returnbool
bool deleteUserByName(const char* xmlPath,const string userName) {XMLDocument doc;if(doc.LoadFile(xmlPath)!0) {coutload xml file failedendl;return false;}XMLElement* rootdoc.RootElement();//doc.DeleteNode(root);//删除xml所有节点XMLElement* userNodequeryUserNodeByName(root,userName);if(userNode ! NULL) {userNode-DeleteAttribute(Password);//删除属性XMLElement* emailNodeuserNode-FirstChildElement(Email);userNode-DeleteChild(emailNode); //删除指定节点//userNode-DeleteChildren();//删除节点的所有孩子节点if(doc.SaveFile(xmlPath)0)return true;}return false;
}验证代码
int main(int argc, char* argv[]) {//删除用户某些信息if(deleteUserByName(./user.xml,lvlv))coutdelete successfullyendl;elsecoutdelete failedendl;return 0;
}删除结果
?xml version1.0 encodingUTF-8 standaloneno?
DBUSERUser NamelvlvGender10/GenderMobile13995648666/Mobile
/User
/DBUSER4.其它常见用例
4.1 获取 XML 文件申明
//function:获取xml文件申明
//param:xmlPath:xml文件路径strDeclxml申明
//returnbool
bool getXMLDeclaration(const char* xmlPath,string strDecl) {XMLDocument doc;if(doc.LoadFile(xmlPath)!0) {coutload xml file failedendl;return false;}XMLNode* decldoc.FirstChild(); if (NULL!decl) { XMLDeclaration* declaration decl-ToDeclaration(); if (NULL!declaration) { strDecl declaration-Value();return true;} }return false;
}验证代码
int main(int argc,char* argv[]) {//获取xml文件申明string strDecl;if(getXMLDeclaration(./user.xml,strDecl)){coutdeclaration:strDeclendl;}return 0;
}验证结果
declaration:xml version1.0 encodingUTF-8 standaloneno4.2 打印 XML 文件至标准输出
//function:将xml文件内容输出到标准输出
//param:xmlPath:xml文件路径
void print(const char* xmlPath) {XMLDocument doc;if(doc.LoadFile(./user.xml)!0) {coutload xml file failedendl;return;}doc.Print();
}4.3 XML 文件内容输出至内存
XMLPrinter printer;
doc.Print( printer );
// printer.CStr() has a const char* to the XML其它实例待以后用到再补充。 参考文献
TinyXML2 官网leethomason github.TinyXML2