一. 解析方式

xml的2种解析方式(DOM和SAX解析方式): https://blog.csdn.net/weixin_42472048/article/details/81264570

dom解析和sax解析区别:
     dom方式解析
            根据xml的层级结构在内存中分配一个树形结构,把xml的标签,属性和文本都封装成对象
            优点:很方便实现增删改操作
            缺点:如果文件过大,造成内存溢出
     sax方式解析
            采用事件驱动,边读边解析,从上到下,一行一行的解析,解析到某一个对象,返回对象名称,
            当SAX解析结束,不会保存任何XML文档的数据。
            优点:如果文件过大,不会造成内存溢出,方便实现查询操作
            缺点:不能实现增删改操作

二. 第三方库介绍对比:

尽管XML解析器有很多种,而且功能差异很大,甚至是支持跨平台、多语言,但是对于你的应用而言,尽量选择一种相对熟悉、功能够用的即可,没必要去追求庞杂的解析器,我们只需关注:功能够用、相对稳定、适合扩展这三个功能即可。一旦有问题,修正和扩展都要更为容易。

PugiXML:

仅DOM方式;速度快; https://www.cnblogs.com/haomiao/p/5041065.html

RapidXML:

仅DOM方式;速度快

libxml:

可以验证DTD;几乎适合于常见的所有操作系统下编译和开发使用; C代码支持XML解析最全的,支持xpath语法;

libxml++(地址:http://libxmlplusplus.sourceforge.net/)是对libxml XML解析器的C++封装版本。此外还有各种语言封装包,参加官方链接。

libxml的使用(1)--读取xml:https://www.cnblogs.com/fire909090/p/6798136.html

libxml2的安装及使用[总结]:https://www.cnblogs.com/Anker/p/3542058.html

Libxml2主要的优点有:

( http://blog.sina.com.cn/s/blog_a7c44c8801018qc5.html ):

1.   安装、使用比较简单,容易入门;

2.   支持的编码格式较多,能很好的解决中文问题(使用一个很简单的编码转换函数);

3.   支持Xpath解析(这点对于任意定位xml文档中的节点还是很有用的哦);

4.    支持Well-formed 和valid验证,具体而言支持DTD验证,Schema验证功能正在完善中(目前多数解析器都还不完全支持shema验证功能);

5.   支持目前通用的Dom、Sax方式解析等等。

不足之处也是有的:

1.  指针太多,使用不当时就会出现错误,在Linux系统中表现为常见的段错误,同样管理不当易造成内存泄漏;

2.个人认为内面有些函数的功能设计的不是很好(比如获取Xpath函数,它不获取节点属性,这样子有些情况会定位不准)

C/C++利用libxml2高效输出XML大文件详解:https://www.jb51.net/article/128707.htm

Xerces:

支持SAX和DOM ;可以验证DTD;文件越大,element解析越慢;除了C++版本,Xerces同时还提供Xerces Java,Xerces Perl等版本。

TinyXML:

DOM方式;C++开发,支持Windows和Linux。小巧玲珑,非常适合存储简单数据,配置文件,对象序列化等数据量不是很大的操作。支持对XML的读取和修改,不直接支持XPath,需要借助另一个相关的类库TinyXPath才可以支持XPath.

一个例子:https://blog.csdn.net/woniu211111/article/details/76445059

TinyXml库 使用方法: https://blog.csdn.net/qq_26374395/article/details/80171906

使用TinyXML读写xml文件: https://blog.csdn.net/lgstudyvc/article/details/77859919

TinyXml快速入门: https://blog.csdn.net/qq_38022972/article/details/82221898

TinyXml入门简易教程: https://blog.csdn.net/qq_24571549/article/details/70980125

-------------------------------------------------------------------------------------------------

配置使用过程:

1. tinyxml在windows环境下编译:https://blog.csdn.net/u012870721/article/details/78237930

2. Windows下Tinyxml的正确配置:https://blog.csdn.net/iorijjw/article/details/8515268

(在 "项目" -> "xxx 属性" -> "配置属性" -> "连接器" -> "输入" 中, 找到 "忽略特定默认库", 如果是 Debug 模式则向其中输入 libcmtd.lib 这步做与不做,有待进一步研究)

3. TinyXML Tutorial 中文指南:

http://www.cnblogs.com/kex1n/archive/2010/10/03/1841502.html

在线文档: http://www.grinninglizard.com/tinyxmldocs/tutorial0.html
------------------------------------------------------------------

遇到的问题:

tinyxml中文乱码(内存模式): https://blog.csdn.net/myruo/article/details/81514118

-------------------------------------------------------------------------------------------------

一个简单的实例应用:写xml文件

#include "tinyXml.h"
#pragma comment(lib, "tinyxml.lib")
#pragma comment(lib, "tinyxmlSTL.lib")int main()
{build_simple_doc();system("pause");return 0;
}
void build_simple_doc()
{/*<?xml version="1.0" encoding="utf-8" ?><scene version="0.5.0"><integrator type="path"><boolean name="hideEmitters" value="false" otherAttriube="someValue" /></integrator><!--物体模型--></scene>*/TiXmlDocument doc;TiXmlDeclaration *decl = new TiXmlDeclaration("1.0", "utf-8", "");doc.LinkEndChild(decl);TiXmlElement *rootElement = new TiXmlElement("scene");rootElement->SetAttribute("version", "0.5.0");//TiXmlText *text = new TiXmlText("world");//rootElement->LinkEndChild(text);doc.LinkEndChild(rootElement);TiXmlElement *myIntegrator = new TiXmlElement("integrator");myIntegrator->SetAttribute("type", "path");rootElement->LinkEndChild(myIntegrator);TiXmlElement *myBoolean = new TiXmlElement("boolean");myBoolean->SetAttribute("name", "hideEmitters");myBoolean->SetAttribute("value", "false");myBoolean->SetAttribute("otherAttriube", "someValue");myIntegrator->LinkEndChild(myBoolean);/*注意:myBoolean没有EndChild, 所以不会有 </boolean> 这一行同一个element不能添加两次(树结构),会导致卡死!!*/TiXmlComment *comment = new TiXmlComment();comment->SetValue("物体模型");rootElement->LinkEndChild(comment);doc.SaveFile("example1_byhand.xml");
}

一个简单的实例应用:修改xml文件:

代码:

void modify_secene_xml(const char* pFilename)
{printf("File: %-s:\n", pFilename);TiXmlDocument doc(pFilename);if (!doc.LoadFile()) return;TiXmlHandle hDoc(&doc);TiXmlElement* pElem;TiXmlHandle hRoot(0);TiXmlHandle subRoot(0);pElem = hDoc.FirstChildElement().Element();if (!pElem) return;hRoot = TiXmlHandle(pElem);//pElem = hRoot.FirstChild("shape").FirstChildElement().Element();//pElem = pElem->NextSiblingElement()->NextSiblingElement();modify string in texture    pElem = hRoot.FirstChild("shape").FirstChild("bsdf").Element();subRoot = TiXmlHandle(pElem);pElem = subRoot.FirstChild("bsdf").FirstChild("texture").FirstChildElement().Element();printf( "%-20s\t-->\t", pElem->Attribute("value") );pElem->SetAttribute("value", "mydefine.png");             // <--------------------printf("%-20s\n", pElem->Attribute("value"));modify value of string of emitterpElem = hRoot.FirstChild("emitter").FirstChild("string").Element();printf("%-20s\t-->\t", pElem->Attribute("value"));pElem->SetAttribute("value", "mydefineenvmap.exr");     // <--------------------printf("%-20s\n", pElem->Attribute("value"));doc.SaveFile(pFilename);
}
//************************************************************//
int main()
{modify_secene_xml("test_byhand.xml");                    // <--------------------system("pause");return 0;
}

待修改文件:(修改 "original.png" 及 "original.exr" )

<?xml version="1.0" encoding="utf-8" ?>
<scene version="0.5.0"><integrator type="path"><boolean name="hideEmitters" value="false" /></integrator><!-- 物体模型 --><shape type="obj"><string name="filename" value="template.obj" /><transform name="toWorld"><scale value="10" /></transform><bsdf type="twosided"><bsdf type="diffuse"><texture type="bitmap" name="reflectance"><string name="filename" value="original.png" /></texture></bsdf></bsdf></shape><sensor type="perspective"><float name="fov" value="60" /><transform name="toWorld"><lookat target="0 0 0" origin="-10 8 -10" up="0 1 0" /></transform><sampler type="ldsampler"><integer name="sampleCount" value="128" /></sampler><film type="hdrfilm"><boolean name="banner" value="false" /><integer name="height" value="512" /><integer name="width" value="512" /><rfilter type="gaussian" /></film></sensor><!-- 环境贴图 --><emitter type="envmap" id="Area_002-light"><string name="filename" value="original.exr" /><float name="scale" value="1" /></emitter>
</scene>

打印结果:

三. 链接

C++各大有名库的介绍对比:https://blog.csdn.net/business122/article/details/78260909

常见C/C++ XML解析器比较:https://www.cnblogs.com/snailgardening/p/xml_jiexi.html

xml解析库对比总结(解析方式,第三方库,TinyXml)相关推荐

  1. 20个必不可少的Python库也是基本的第三方库(转载)

    20个必不可少的Python库也是基本的第三方库 读者您好.今天我将介绍20个属于我常用工具的Python库,我相信你看完之后也会觉得离不开它们.他们是: Requests.Kenneth Reitz ...

  2. python 删除第三方库_python 安装移动复制第三方库操作

    一.绪论 在使用python开发过程中经常会使用到第三方库.因此就涉及到了如何安装.复制移动. 二.安装方式 第三方库的安装方式 1.python自带包管理器:使用pip命令自动安装.例如:pip i ...

  3. python升级第三方库_python一键升级所有第三方库

    import pip from subprocess import call for dist in pip.get_installed_distributions(): call("pip ...

  4. python复制库_python 安装移动复制第三方库操作

    一.绪论 在使用python开发过程中经常会使用到第三方库.因此就涉及到了如何安装.复制移动. 二.安装方式 第三方库的安装方式 1.python自带包管理器:使用pip命令自动安装.例如:pip i ...

  5. python怎么导入第三方库完整教程_Python 安装第三方库教程

    Python是一门优雅的语言,简洁的语法,强大的功能.包含丰富的第三方库,那么问题来了,如何安装这些第三方库(包)呢? 我的电脑:Windows 764位 Python IDE软件:PyCharm 2 ...

  6. python第三方库下载-3、python第三方库的安装方式

    前言:在学习Python过程中,经常要用到很多第三方库,面对各种不同情况,Python为我们提供了多种安装方法,这里主要介绍三种方法:pycharm在线安装.pip在线安装(强烈推荐).离线安装. 方 ...

  7. 20个必不可少的Python库也是基本的第三方库

    引用: https://www.cnblogs.com/jiangchunsheng/p/9275881.html 读者您好.今天我将介绍20个属于我常用工具的Python库,我相信你看完之后也会觉得 ...

  8. 不是python中用于开发用户界面的第三方库-20个必不可少的Python库也是基本的第三方库...

    传智播客博学谷 微信号:boxuegu- get最新最全的IT技能 免费领取各种视频资料 今天将介绍20个常用工具的Python库,我相信你看完之后也会觉得离不开它们.他们是: Requests.Ke ...

  9. 库 python_20个必不可少的Python库也是基本的第三方库

    今天将介绍20个常用工具的Python库,我相信你看完之后也会觉得离不开它们.他们是: Requests.Kenneth Reitz写的最富盛名的http库.每个Python程序员都应该有它. Scr ...

最新文章

  1. 3.5.3 CSMA协议
  2. python操作系统-Python_操作系统的发展史
  3. These dependencies were not found: *!!vue-style-loader!css-loader?
  4. STM32单片机,禁止系统启动时的变量初始化
  5. 13、不同存储引擎的数据表在文件系统里是如何表示的?
  6. 这些Spring面试题,你都会了吗?
  7. 基于Python+Django的图书馆管理系统
  8. [置顶] Ubuntu 12.04中文输入法的安装
  9. selenium page_source跟手动打开的不一样_爬虫界又出神器|一款比selenium更高效的利器...
  10. 主机甲采用停等协议向主机乙_TCP/IP 协议——详解篇
  11. vc调试总是提示项目已过期
  12. 企业邮箱能帮企业带来哪些好处?
  13. btrfs和ntfs linux5,如何选择文件系统EXT4、Btrfs 和 XFS
  14. 事件参数screenX、pageX、clientX 、offsetX的区别
  15. css3魔方3乘3每层旋转_CSS3旋转魔方
  16. 利用AI+大数据的方式分析恶意样本(四十)
  17. Swift4打造今日头条视频实战视频教程
  18. Linux Ubuntu
  19. html空心字体颜色,用-webkit-text-stroke实现空心文字
  20. 什么是日光诱导叶绿素荧光?

热门文章

  1. HNUST 1669 我的算法会不会Time Limit Exceeded
  2. 在AWS上配置深度学习主机
  3. 你对面向对象思想的理解?
  4. 2022世界杯在哪个国家举办,具体日期
  5. python时间控件readonly属性_人生苦短,我学python之python+selenium js处理日历控件(修改readonly属性)...
  6. tinymce系列(三) tinymce 常用API介绍
  7. mac系统python读取文件路径_Python小技巧:3个处理文件路径的简单方法
  8. TM4C123GH6PM程序
  9. Python值传递和引用传递(详细分析)
  10. 【论文翻译】Machine learning: Trends,perspectives, and prospects