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

https://github.com/leethomason/tinyxml2 。它的结构非常精简,仅由 tinyxml2.h 和 tinyxml2.cpp 两个文件组成。TinyXML-2 能够处理 UTF-8 编码方式的 XML 文件,而 Windows 操作系统使用的文字编码方式是 UTF-16,所以如果在 Windows 平台上使用 TinyXML-2,应当留意编码方式的差异,有时需要进行编码转换。

这里举一个简单例子:在简体中文版 Windows 7 平台上,要使用 TinyXML-2 处理一个包含中文字符、UTF-8 编码的 XML 文件,该文件名为 Example.xml,内容如下:

电路板&1号

http://amazon.com

现在要读取元素节点 circuit_board 中包含的文本节点(其实就是“电路板&1号”),示例程序如下:

/**************************************************

* Author: HAN Wei

* Author's blog: http://blog.csdn.net/henter/

* Date: April 17th, 2017

* Description: demonstrate how to read XML content

including Chinese characters by using TinyXML-2

**************************************************/

#include "Windows.h"

#include "tinyxml2.h"

#include

using namespace std;

int main(void)

{

char file_name[256] = {"Example.xml"};

wchar_t *buffer;

int buffer_len;

tinyxml2::XMLDocument doc;

tinyxml2::XMLText* CircuitBoardTextNode;

_wsetlocale(LC_ALL, L"chs");

doc.LoadFile(file_name);

if ( doc.ErrorID() )

{

wprintf(L"加载配置文件出错!\n");

system("pause");

return (-1);

}

doc.Print();

CircuitBoardTextNode = doc.FirstChildElement("material_list")->FirstChildElement("circuit_board")->FirstChild()->ToText();

const char* CircuitBoardName = CircuitBoardTextNode->Value();

if ( !(buffer_len = MultiByteToWideChar(CP_UTF8, 0, CircuitBoardName, -1, NULL, 0)) )

{

wprintf(L"编码转换错误!\n");

system("pause");

return (-1);

}

buffer = new wchar_t[buffer_len];

if ( !(MultiByteToWideChar(CP_UTF8, 0, CircuitBoardName, -1, buffer, buffer_len)) )

{

wprintf(L"编码转换错误!\n");

system("pause");

return (-1);

}

wprintf(L"\n%ls\n\n", buffer);

delete [] buffer;

system("pause");

return 0;

}

使用Visual Studio编译并执行这个程序,输出结果如下:

从输出结果可以看出:

1. 使用 TinyXML-2 从 XML 中读取内容时,会将读出的字符串以 char 数组形式存储。在中文版 Windows 操作系统中,使用 tinyxml2::XMLDocument 类的 Print( ) 方法输出 XML 文件的内容时,如果输出内容是可显示的 ASCII 字符,不会有任何问题;如果输出内容是 UTF-8 编码的中文字符,则会显示乱码。

2. 为了能在 Windows 中正确显示 XML 中包含的中文字符,可以使用 Kernel32.dll 中包含的 MultiByteToWideChar( ) 函数,将 UTF-8 编码的中文字符转换为 UTF-16 编码方式的中文字符。在 Windows 中能正确显示 UTF-16 编码的中文字符,不会出现乱码。

3. 使用 tinyxml2::XMLDocument 类的 Print( ) 方法输出 XML 文件中的内容时,Print( ) 方法不会对 XML 规范中定义的转义字符做转换。在本例中,Print( ) 方法被调用后,并未将 & 转换为 & 。

4. 当 tinyxml2::XMLNode::ToText( ) 方法被调用时,会自动处理 XML 规范中定义的转义字符。在本例中,将 & 自动转换为 & ,不需要编程者再做处理。

在文本编辑器 EditPlus 或 Notepad++ 中,能够选择文件编码方式,操作类似于下图:

对于 Example.xml 这个文件,不管以包含 BOM 的 UTF-8 编码方式保存它,还是以不带 BOM 的 UTF-8 编码方式保存它,运行上面的示例程序,发现都能够正常执行。由此可知,对于 UTF-8 编码的 XML 文件中包含或不包含 BOM 这两种情况,TinyXML-2 都能够正确处理。

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

  1. tinyxml 读取文本节点_【C++】【TinyXml】xml文件的读写功能使用——写xml文件

    TinyXml工具是常用比较简单的C++中xml读写的工具 需要加载 #include "TinyXml\tinyxml.h" 在TinyXML中,根据XML的各种元素来定义了一些 ...

  2. tinyxml 读取文本节点_用TinyXml2读取XML文件的一个简单Demo

    废话少说直接上代码,需要的人自然一看便懂,对于第一次接触TinyXml2的人来说还是有帮助的. 18 1.7 28 1.6 30 1.8 tinyxml2::XMLDocument Doc; Doc. ...

  3. 读取文本节点_我最喜爱的Dynamo节点TOP 10

    应好多小伙伴的要求,"BIM的乐趣"微信群重新恢复运营,由于人数过百了,有兴趣的小伙伴可以添加我的微信(微信号:leaderspring)拉你入群,记得备注来源哦~~ 今天分享下, ...

  4. 读取文本节点_总结语录|Part1:Dynamo节点介绍

    记得点蓝色关注 想必开始接触Dynamo的小伙伴清楚 在2017版前Revit,没有Dynamo附带在插件里面,只能单独安装Dynamo,在2018Revit之后就会有Dynamo的插件,那么两者有什 ...

  5. tinyxml 读取文本节点_c++中用TINYXML解析XML文件

    TinyXML介绍 最近做一个负载均衡的小项目,需要解析xml配置文件,用到了TinyXML,感觉使用起来很容易,给出一个使用TinyXML进行XML解析的简单例子,很多复杂的应用都可以基于本例子的方 ...

  6. Windows 下的 terminal pro 打开终端 总是在默认位置 怎么在当前文件中打开呢

    Windows 下的 terminal pro 打开终端 总是在默认位置 怎么在当前文件中打开呢 step1 这里先打开终端 - step2 找到编辑json文件 step3 ctrl + f 查找到 ...

  7. tinyxml 读取文本节点_TinyXml 读写XML文件

    使用Tinyxml创建和读取XML文件的优点:1,可在Windows和Linux中使用:2,方便易学,易用,可在http://sourceforge.net/projects/tinyxml/获取源代 ...

  8. tinyxml 读取文本节点_TinyXML读取xml文件

    TinyXML读取xml文件 2020-05-19 编程之家收集整理的这篇文章主要介绍了TinyXML读取xml文件,编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考. 例子 xml 内容: ...

  9. 配置多个git账号_在Windows下配置多个git账号

    本文记录了在Windows下配置两个github账号的过程. 1. 生成并部署SSH key 安装好Git客户端后,打开git bash,输入以下命令生成user1的SSH Key: ssh-keyg ...

最新文章

  1. 小米输掉官司,倒打一耙不如坦然认错
  2. jradiobutton设置默认选项_JRadioButton(单选按钮)添加事件监听
  3. boost::sort模块实现spreadsort wstring 排序示例
  4. python3学习笔记10(迭代器和生成器)
  5. Vue nextTick 机制
  6. mysql5建函数报1064错误,MySQL存储函数创建错误ERROR 1064和1327
  7. VB Listview导出到CSV文件函数
  8. datagrid commandname
  9. 常用中文字体 Unicode 编码
  10. SVN工具介绍- VisualSVN Server与TortoiseSVN
  11. 昆仑通泰触摸屏与v20变频器uss通讯,控制变频器
  12. python opencv Shi-Tomasi 角点检测和特征跟踪
  13. unbuntu基本操作
  14. 虚拟机linux ecap文件在,为AM335x移植Linux内核主线代码(30)eCAP的PWM波功能
  15. apache与tomcat动静分离
  16. h5活动是什么意思_H5是什么,怎么用H5做运营活动?
  17. 阿里云购买云服务器流程及注意事项(新用户必看图文教程)
  18. [Python] 通过采集两万条数据,对《无名之辈》影评分析
  19. 微信小程序播放背景音乐,关闭背景音乐的操作
  20. 【Vue.JS】纯 Vue.js 制作甘特图

热门文章

  1. php字符串反转abcdefg_php中实现字符串翻转的方法
  2. Python学习笔记(序列和元组)
  3. Socket编程应用——开发聊天软件
  4. MySQL中使用外键约束的注意事项
  5. Python 的协程库 greenlet 和 gevent
  6. Scrapy源码阅读分析_2_启动流程
  7. log4j 控制台和文件输出乱码问题解决
  8. iBatis 事务控制 与 两表操作将SQL语句写入单表
  9. 计算机一级考试题组成,计算机一级考试试题汇总
  10. mysql 窗口函数最新一条_MySQL 8.0 窗口函数(window functions)