文章目录

  • 1.概述
  • 2.构造数据并创建xml文件
  • 3.解析xml文件并读取数据
  • 4.其他一些操作
  • 5.总结

1.概述

tinyxml2 github地址
本文涵盖了日常编码中会使用tinyxml2库进行的一些操作,包括:解析xml文件或者xml格式内容的字符串、获取xml节点属性与内容、增加节点或属性、删除节点或属性、将doc对象保存为xml文件或者字符串、从一个文档拷贝节点到另一个文档中等。
本文以类似svg内容存储的数据来进行实例操作,以下为实例操作涉及到的数据。

<?xml version="1.0" encoding="UTF-8"?>
<draw width="200" height="100" version="1" original="true" author="FabianD" createtime="2021-04-08"><geometry id="1"><line x1="5" y1="5" x2="5" y2="10"/><circle cx="5" cy="5" r="5"/></geometry><remark>势均力敌,才能生生不息</remark>
</draw>

2.构造数据并创建xml文件

 using namespace tinyxml2;XMLDocument doc;//定义doc对象//<1.增加xml文档声明//方式1
const char* declaration="<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
XMLError result = doc.Parse(declaration);
//方式2,生成的内容同上
XMLDeclaration* declarationElement = doc.NewDeclaration();
doc.InsertFirstChild(declarationElement);//<2.添加节点
XMLElement* drawElement = doc.NewElement("draw");
doc.InsertEndChild(drawElement);//<3.添加属性并设置属性值
drawElement->SetAttribute("width", 200.0);//double类型
drawElement->SetAttribute("height", 100.0);//double类型
drawElement->SetAttribute("version", 1);//int类型
drawElement->SetAttribute("original", true);//bool类型
std::string author = "FabianD";
drawElement->SetAttribute("author", author.c_str());//const char*类型
drawElement->SetAttribute("createtime", "2021-04-08");//const char*类型//<4.添加子节点
XMLElement* geometryElement = doc.NewElement("");//暂不设置节点名称
geometryElement->SetName("geometry");//通过SetName函数设置节点名称
geometryElement->SetAttribute("id", 1);
drawElement->InsertEndChild(geometryElement);//添加直线节点至geometryElement
XMLElement* lineElement = doc.NewElement("line");
lineElement->SetAttribute("x1", 5);
lineElement->SetAttribute("y1", 5);
lineElement->SetAttribute("x2", 5);
lineElement->SetAttribute("y2", 10);
geometryElement->InsertEndChild(lineElement);//添加圆节点至geometryElement
XMLElement* circleElement = doc.NewElement("circle");
circleElement->SetAttribute("cx", 5);
circleElement->SetAttribute("cy", 5);
circleElement->SetAttribute("r", 5);
geometryElement->InsertEndChild(circleElement);//添加remarkElement至根节点
XMLElement* remarkElement = doc.NewElement("remark");
remarkElement->SetText("势均力敌,才能生生不息");//设置节点内容
drawElement->InsertEndChild(remarkElement);//<5.保存至文件中
result = doc.SaveFile("Draw.xml");//会清除原来文件中的内容

3.解析xml文件并读取数据

using namespace tinyxml2;
XMLDocument doc;
XMLError result;
//<1.加载解析文件
result = doc.LoadFile("Draw.xml");
if (result == XML_SUCCESS) {//<2.获取根节点XMLElement* drawElement = doc.RootElement();//获取根节点if (drawElement) {//<3.获取属性值//方式1double width = 0;result = drawElement->QueryDoubleAttribute("width", &width);if (result == XML_SUCCESS) {std::cout << "Width:" << width << std::endl;}else {std::cout << "根节点没有width属性" << std::endl;}//方式2const char* heightPtr = drawElement->Attribute("height");if (heightPtr) {double height = std::stod(heightPtr);//stod为新特性下的函数std::cout << "Height:" << height << std::endl;}else {std::cout << "根节点没有height属性" << std::endl;}//方式3int version = drawElement->IntAttribute("version", 0);//第二个参数为默认返回值,这种方式在找不到属性时会返回默认值,适合确定有属性存在的情况std::cout << "Version:" << version << std::endl;//获取其他类型属性值bool original = false;result = drawElement->QueryBoolAttribute("original", &original);if (result == XML_SUCCESS) {std::cout << "Original:" << original << std::endl;}const char* authorPtr = drawElement->Attribute("author");if (authorPtr) {std::cout << "Author:" << authorPtr << std::endl;}//<4.获取子节点XMLElement* geometryElement = drawElement->FirstChildElement("geometry");//传入节点名称if (geometryElement) {XMLElement* childElement = geometryElement->FirstChildElement();//不传入节点名称,返回第一个子节点//遍历获取子节点while (childElement) {if (!std::strcmp(childElement->Name(), "line")) {//获取直线节点相关属性double x1 = childElement->DoubleAttribute("x1");double y1 = childElement->DoubleAttribute("y1");std::cout << "LineX1:" << x1 << std::endl;//...}else if (!std::strcmp(childElement->Name(), "circle")) {//获取圆节点相关属性double cx = childElement->DoubleAttribute("cx");double cy = childElement->DoubleAttribute("cy");std::cout << "CircleCx:" << cx << std::endl;//...}childElement = childElement->NextSiblingElement();//获取同一级的下一节点}}//获取remark子节点XMLElement* remarkElement = drawElement->FirstChildElement("remark");if (remarkElement) {const char* remark = remarkElement->GetText();//获取节点内容std::cout << "Remark:" << remark << std::endl;}//<5.修改节点//修改节点属性值及内容if (remarkElement) {remarkElement->SetText("至死不渝");remarkElement->SetAttribute("type", "love");}//删除属性及节点drawElement->DeleteAttribute("version");//删除version属性geometryElement->DeleteChild(geometryElement->FirstChildElement("line"));//删除line节点//geometryElement->DeleteChildren();//删除所有子节点doc.SaveFile("Draw.xml");//重新保存}else {std::cout << "文件没有根节点" << std::endl;}
}else { std::cout << "解析失败:" << result << std::endl;
}

4.其他一些操作

using namespace tinyxml2;
XMLDocument doc;
XMLError result = doc.LoadFile("Draw.xml");
if (result == XML_SUCCESS) {//<1.读取xml文件内容至const char*中XMLPrinter printer;doc.Print(&printer);const char* contentPtr = printer.CStr();std::cout << "xml content:" << contentPtr << std::endl;//<2.解析字符串内容XMLDocument docx;result = docx.Parse(contentPtr);if(result==XML_SUCCESS){if (docx.RootElement()) {std::cout << docx.RootElement()->Name();}}//<3.复制doc中的节点到另一个doc中XMLDocument docTarget;result = docTarget.LoadFile("Draw.xml");if (result == XML_SUCCESS) {XMLElement* drawElementSource = doc.RootElement();XMLElement* drawElementTarget = docTarget.RootElement();if (drawElementTarget) {XMLElement* geometryElementTarget = drawElementTarget->FirstChildElement("geometry");if (geometryElementTarget) {XMLNode* geometryElementSource = geometryElementTarget->DeepClone(&doc);//复制节点到新doc中drawElementSource->InsertFirstChild(geometryElementSource);//执行插入操作result = doc.SaveFile("Draw.xml");}}}
}

5.总结

tinyxml2经常用到的几个对象:

1.tinyxml2::XMLNode:XMLDocment、XMLElement的基类

  • XMLNode* InsertFirstChild(XMLNode* node): 在对象(文档/节点)最前面插入节点node。
  • XMLNode* InsertEndChild(XMLNode* node): 在对象(文档/节点)最后面插入节点node。
  • XMLNode* InsertAfterChild(XMLNode* afterNode,XMLNode* node): 在节点afterNode后面插入节点node。
  • void DeleteChild(XMLNode*): 删除子节点node。
  • void DeleteChildren(): 删除所有子节点。
  • static void DeleteChild(XMLNode*): 删除节点node。
  • XMLNode* DeepClone(XMLDocument* target): 拷贝一份数据到target文档中,返回有同样数据的XMLNode*。
  • XMLElement* FirstChildElement(const char* name==NULL): 获取对象(文档/节点)下节点名称为name的第一个子节点。
  • XMLElement* LastChildElement(const char* name==NULL): 获取对象(文档/节点)下节点名称为name的最后一个子节点。
  • XMLNode* Parent(): 获取(文档/节点)的父节点。
  • XMLElement* NextSiblingElement(const char* name==NULL): 获取对象(文档/节点)同级中往后名称为name的节点。
  • XMLElement* PreviousSiblingElement(const char* name==NULL): 获取对象(文档/节点)同级中往前名称为name的节点。

2.tinyxml2::XMLDocument:

  • XMLError LoadFile(const char*): 用来加载解析xml文件。
  • XMLError SaveFile(const char*): 用来保存数据至xml文件。
  • XMLError Parse(const char*): 用来解析字符串内容。
  • XMLDeclaration* NewDeclaration(): 用来创建doc的文档声明,创建后,还需要将其插入XMLDocument对象中才有作用。
  • XMLElement* NewElement(): 用来创建doc的节点,创建后,还需要将其插入XMLDocument对象中才有作用。

3.tinyxml2::XMLElement:

  • void SetAttribute(const char*, T value): 设置属性,T可以是任意基础类型。
  • void SetName( const char* str, bool staticMem=false ): 设置节点名称。
  • XMLError QueryIntAttribute( const char* name, int* value ): 获取名称为name,type为int的属性的值,如果该值不是int类型,返回值将不是XML_SUCCESS。同类型的函数还有:QueryDoubleAttribute、QueryBoolAttribute等。
  • const char* XMLElement::Attribute( const char* name, const char* value ): 获取名称为name的属性值,如果没有该属性,则返回默认值value。
  • int IntAttribute(const char* name, int defaultValue): 获取名称为name的属性值,如果没有该属性,则返回默认值defaultValue。

tinyxml2使用相关推荐

  1. [转]xml解析工具的效率比较QDomDocument、TinyXml-2、RapidXml、PugiXml

    转自:http://www.itdaan.com/blog/2017/02/20/301ad47832f4.html 由于windows环境下测试不稳定,博主选择在linux下进行的测试! Qt - ...

  2. TinyXML2 的使用

    TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译.这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树 ...

  3. tinyxml2解析XML文件

    tinyxml2::XMLDocument xmlDoc;tinyxml2::XMLError error = xmlDoc.LoadFile(cfgFile.c_str());if (error ! ...

  4. tinyxml 读取文本节点_在Windows下使用TinyXML-2读取UTF-8编码包含中文字符的XML文件...

    TinyXML-2 是一个用 C++ 开发的小巧.高效的 XML 解析工具,它在 GitHub 网站上的链接为: https://github.com/leethomason/tinyxml2 .它的 ...

  5. qt中tinyxml2的基本使用方法

    TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译. 这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML ...

  6. 《转》 在C++中使用TinyXML2解析xml

    读取和设置xml配置文件是最经常使用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,由于它的API接口和Java的十分类似.面向对象性非常好.       TinyX ...

  7. 初步接触TinyXML2

    写这篇文章纯属偶然. 我很少接触xml,工作上也没使用过.即使使用,也是别人做好的接口,直接调用.最近的一个项目中,因为某些策略问题,造成项目的代码十分混乱,东拼西凑,做成了个不像样的东西.其中有部分 ...

  8. TinyXML2 入门教程

    代码编译运行环境:Linux 64bits + Debug + g++ -m64(-m 表示生成 64bits 的程序) 文章目录 1.TinyXML2 概述 2. TinyXML1 与 TinyXM ...

  9. TinyXML2使用教程

    TinyXML2使用教程 原文转自 http://blog.csdn.net/K346K346/article/details/48750417 1.TinyXML2概述 TinyXML2是simpl ...

  10. 【转载】TinyXML2使用教程

    原文见 https://blog.csdn.net/K346K346/article/details/48750417 1.TinyXML2概述 TinyXML2是simple.small.effic ...

最新文章

  1. DICKSON隆重推荐的博客 --- SAP
  2. Adobe Premiere Pro CC 2018下载安装方法讲解
  3. Java杂记3—流程控制之条件
  4. PHP警告:socket_bind():无法绑定地址
  5. 浅谈对机器学习方法(决策树,SVM,knn最近邻,随机森林,朴素贝叶斯、逻辑回归)的理解以及用sklearn工具实现文本分类和回归方法...
  6. 硬件nat关闭还是开启_今天才发现,路由器中的硬件NAT加速能提升20%网络带宽
  7. JAVA判断素数法+引用方法
  8. Python读取excel文件数据并画柱状图
  9. Spyder python 多行注释快捷键
  10. 海思芯片固件修改工具_魔百盒九联代工M301H海思Hi3798MV310芯片红外蓝牙语音遥控免拆卡刷固件及刷机教程202009版...
  11. Java应用中CPU使用率过高该怎么解决
  12. 【电路第八章】相量法
  13. 拼多多上架工具有哪些,拼多多产品上架流程详解
  14. PlayCanvas网页3d展示
  15. font-family、font-style、font-weight、font-variant的区别「In CSS」
  16. access 分组序号_如何对Access 2007报表进行分组
  17. springboot微信公众号自定义菜单创建及响应
  18. jQuery插件之——简单日历
  19. iOS 网络权限弹框处理
  20. SpringBoot之yaml语法、配置文件、多环境切换

热门文章

  1. 软件测试面试题:性能测试指标有哪些?
  2. VR技术在教育中的应用:如何帮助学生更好地理解和掌握知识
  3. NLP for Quant:使用NLP和深度学习预测股价(附代码)
  4. 科技巨头数据中心冷却揭秘:谷歌有AI 微软玩潜水
  5. 30张设计师的手绘网页草图(原型图/框架图)
  6. jenkins - Manage and Assign Roles
  7. 对以下6种常用的内部排序算法进行比较:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序。
  8. 独家!了不起的UP系列产品,不一样的开发板—UP Core Plus Board(四)
  9. Redis配置成windows服务方法
  10. 新浪微博 分享 功能的实现