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

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 都能够正确处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506057.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

矩阵特征值的用matlab,[急求]谁可以用matlab帮我运行求矩阵特征值的命令???...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼v Columns 1 through 60.0529 0.0228 - 0.0573i 0.0228 0.0573i 0.0222 0.0630i 0.0222 - 0.0630i -0.0630 0.0105i0.2249 -0.0870 0.2003i -0.0870 - 0.2003i 0.1077 0.2366i 0.1077 - 0.2366i 0.1861 0.0350i0.0977 -0.082…

蓝牙版本avrcp怎么选_500元内无线蓝牙耳机测评年轻人的第一款廉价蓝牙耳机怎么选?...

这是马克君的第 90 篇对比测评-建议佩戴耳机体验-?- 10款TWS耳机测评 -TWSTrue Wireless Stereo⇩真无线立体声自AirPods问世以来,真无线耳机的概念开始爆火?。虽然AirPods“真香”,但售价也是真滴贵,所以有没有便宜又好用的真无线蓝牙耳机…

kb4023057安装失败_微软重发Win10 KB4023057 补丁,推动Win10更新

8月29日早间消息:微软已经重新发布了Win10补丁KB4023057,其主要帮助用户升级到 Win10 2004或更新版本。微软表示,重新发布的补丁对 Windows Update 本身的可靠性进行了改进。此外,它还可以通过压缩用户目录中的文件来释放计算机上…

数据库查询语句慢如何优化_常见Mysql的慢查询优化方式

1 概念 MySQL的慢查询,全名是慢查询日志,是MySQL提供的一种日志记录,用来记录在MySQL中响应时间超过阀值的语句。 具体环境中,运行时间超过long_query_time值的SQL语句,则会被记录到慢查询日志中。 long_query_time的默…

pytorch中深度拷贝_pytorch:对比clone、detach以及copy_等张量复制操作

pytorch提供了clone、detach、copy_和new_tensor等多种张量的复制操作,尤其前两者在深度学习的网络架构中经常被使用,本文旨在对比这些操作的差别。1. clone返回一个和源张量同shape、dtype和device的张量,与源张量不共享数据内存&#xff0c…

php显示doc文件乱码,如何解决php doc 乱码问题

PHP下载DOC乱码最近做的一个系统,需要下载doc文件以前的代码下载完成后,打开总是乱码...google咯很久也没有解决办法后面总算搞定必须在Header之前进行清除,即 ob_end_clean()$file_size filesize($logName);ob_end_clean();header("Content-type:application/octet-stre…

c++ 多重背包状态转移方程_Python|动态规划关于0-1背包问题

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理以下文章来源于腾讯云,作者:算法与编程之美前言对学算法的同学来说,动态规划是其必学且较为重要的问题之一;…

golang string转int8_golang 中string和int类型相互转换

Notepad++ 默认快捷键Notepad绝对是windows下进行程序编辑的神器之一,要更快速的使用以媲美VIM,必须灵活掌握它的快捷键,下面对notepad默认的快捷键做个整理(其中有颜色的为常用招数): 1 ...DB2执行脚本经常会遇到数据库脚本放在.sql文件中,那么怎么去执…

java 第二天,Java复习第二天

1.idea里jar包和war的区别JAR(JAVA Archive 是类的归档文件),JAR 文件不仅用于压缩和发布,而且还用于部署和封装库、组件和插件程序,并可被像编译器和 JVM 这样的工具直接使用。简单来说,jar包就像一个插件而且是打包已经写好的类…

qlistview 自定义控件_是否可以在QListView中添加自定义窗口小部件?

I have a large log data (100, 1000, 100000, ... records) and I want to visualize it in the following manner:Which widget (e.g. QListView, QListWidget) should I use and how, in order to stay away from performance and memory problems?解决方案Is it possible …

php 零宽断言,正则表达式之零宽断言实例详解

这篇文章主要介绍了正则表达式之零宽断言,简单介绍了零宽断言的概念、分类及php实现技巧与相关注意事项,需要的朋友可以参考下本文实例讲述了正则表达式之零宽断言。分享给大家供大家参考,具体如下:前言之前我曾写了一篇关于正则表达式的文章(http://www…

element ui 多个子组件_vue前端UI框架,一点都不圆润,盘它!

面对众多vue前端UI框架,看着它们干干巴巴、麻麻赖赖的样子,一点都不圆润,跟我一起盘它!Vue移动端UI框架1、Vux(star:15620)VUX(读音 [v’ju:z],同 views)是基于WeUI和Vue(2.x)开发的…

ios 裁剪圆形头像_iOS开发之裁剪圆形头像

- (void)viewDidLoad {[super viewDidLoad];//加载图片UIImage *image [UIImage imageNamed:"菲哥"];//获取图片尺寸CGSize size image.size;//开启位图上下文UIGraphicsBeginImageContextWithOptions(size, NO, 0);//创建圆形路径UIBezierPath *path [UIBezierPa…

python 图像处理_Python中的十大图像处理工具

文章发布于公号【数智物语】 (ID:decision_engine),关注公号不错过每一篇干货。来源 | 大数据文摘(BigDataDigest)编译 | 张秋玥、小七、蒋宝尚本文主要介绍了一些简单易懂最常用的 Python 图像处理库。当今世界充满了各种数据&am…

php函数方法,基于PHP函数的操作方法

如下所示://简单函数function show(){echo "hello";}show();//有参数的函数function show($a){echo "$a";}show("world");//有返回值的函数function show(){return "小V,你好!";}echo show();functi…

centos7安装php5.2yum源操作_Centos7.6使用yum安装PHP7.2

Centos7.6使用yum安装PHP7.21、安装源安装php72w,是需要配置额外的yum源地址的,否则会报错不能找到相关软件包。php高版本的yum源地址,有两部分,其中一部分是epel-release,另外一部分来自webtatic。如果跳过epel-relea…

mysqlclient==1.3.7对应mysql版本_「MySQL」CentOs 7 下安装MySQL

MySQLMySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一YUM 安装mysql1、下载 YUM 仓库文件打开网址: https://dev.mysql.com/downloads/…

php rewinddir(),PHP rewinddir() 函数 ——jQuery中文网

实例打开一个目录,列出其中的文件,充值目录句柄,重新列出其中的文件,然后关闭:$dir "/images/";// Open a directory, and read its contentsif(is_dir($dir)){if ($dh opendir($dir)){//List files in im…

汇编jnl_汇编指令集

1 X86和X87汇编指令大全(有注释)2 ---------- 一、数据传输指令 ----------------------------------------------------3 它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.4 1. 通用数据传送指令.5 MOV 传送字或字节.6 MOVSX 先符号扩展,再传送.7 MOVZX 先零扩展,再传…

nginx log response_nginx优化配置大全

很多程序员面试被问到nginx优化做过哪些,因此来记录下配置文件样例为生产环境样例。1、nginx基本优化安装方式有2种:1、源码包安装 2、yum(apt-get)安装区别为如果用yum安装的话,很方便,并且基本不报错。如…