在VS2022上使用TinyXML来解析XML文件
接下来会介绍 TinyXML 是啥,怎么用, 以及引入头文件显示无法找到实现类, 中文字符读取和写入出现乱码等问题,最后简单讲下**如何 string 转 char ***
1. TinyXML
1.1 介绍
TinyXML 就是一个 2005 年停止更新的封装好的 C++ 解析XML文件的工具包,贼老。现在已经有 TinyXML2 了,还不跟紧潮流吗。其他的介绍我就不知道了,我知道那么多干嘛,你知道那么多干嘛。
1.2 使用
下载代码:TinyXml Main Page ,解压缩后使用TinyXML只需要将其中的6个文件拷贝到项目中就可以直接使用了,这六个文件是:tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp, 添加头文件#include "tinyxml.h"或#include
使用方法?喏,官方文档:TinyXml: Main Page (grinninglizard.com)
啥,你说你想我总结给你,我总结错了怎么办,就像昨天我抄别人写的,结果他写错了,我一直报错,气死,看官方文档才是正道!
2. 遇到的问题以及解决方法
三个东西,第一个花了我4小时,第二个花了我2小时,第三个花了我1小时,问我最后那一小时花哪了,阿勒,写代码不用时间的吗
2.1 引入头文件显示无法找到实现类
-
一开始用了 vscode 出现了这样的错误,应该是编译链接的问题,搞了好久,搞不定,决定下载专业的编译C++的软件 visual studio 2022
-
然后把六个文件分别拷贝到相应区域,这里 注意 先将这六个文件放入工程文件夹 中,在进行拷贝,否则会默认变成引用地址,然后就得弄一对配置外部引入,外部库呀,最后我还没弄成功。(见下图)
-
我直接用 vs 打开了 vscode 写过的那个文件夹,结果连
#include <iostream>
都找不到,后来我是新建一个项目文件的
先这样:
再这样:
然后就可以 #include "tinyxml.h"
并使用了。
2.2 中文字符读取和写入出现乱码
读入的XML是 UTF-8 编码,在程序运行时的编辑是 unicode 编码,写入的时候应该要写入 UTF-8 编码,如果中文没有进行字符编码类型的转换就会出现乱码
两个函数:(我是写在window命令行上运行的:引入头文件 #include <windows.h>)
std::string UTF8_To_string(const std::string& str)
{
int nwLen = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, NULL, 0);
wchar_t* pwBuf = new wchar_t[nwLen + 1];//一定要加1,不然会出现尾巴
memset(pwBuf, 0, nwLen * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), pwBuf, nwLen);
int nLen = WideCharToMultiByte(CP_ACP, 0, pwBuf, -1, NULL, NULL, NULL, NULL);
char* pBuf = new char[nLen + 1];
memset(pBuf, 0, nLen + 1);
WideCharToMultiByte(CP_ACP, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);
std::string retStr = pBuf;
delete[]pBuf;
delete[]pwBuf;
pBuf = NULL;
pwBuf = NULL;
return retStr;
}
std::string string_To_UTF8(const std::string& str)
{
int nwLen = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);
wchar_t* pwBuf = new wchar_t[nwLen + 1];//一定要加1,不然会出现尾巴
ZeroMemory(pwBuf, nwLen * 2 + 2);
::MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), pwBuf, nwLen);
int nLen = ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, NULL, NULL, NULL);
char* pBuf = new char[nLen + 1];
ZeroMemory(pBuf, nLen + 1);
::WideCharToMultiByte(CP_UTF8, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);
std::string retStr(pBuf);
delete[]pwBuf;
delete[]pBuf;
pwBuf = NULL;
pBuf = NULL;
return retStr;
}
2.3 string 转 char*
为啥有这个知识点,因为 new TiXmlText(str)
的 str 如果是 string 会报错,明明官方文档上有这个 string 类型参数的构造函数的,好奇怪。做太累了,不想深究了。
char* string_to_charArr(string content)
{
int len = strlen(content.c_str()) + 1;
char* str = new char[len];
strcpy_s(str, len, content.c_str());
return str;
}