在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 引入头文件显示无法找到实现类

  1. 一开始用了 vscode 出现了这样的错误,应该是编译链接的问题,搞了好久,搞不定,决定下载专业的编译C++的软件 visual studio 2022

  2. 然后把六个文件分别拷贝到相应区域,这里 注意 先将这六个文件放入工程文件夹 中,在进行拷贝,否则会默认变成引用地址,然后就得弄一对配置外部引入,外部库呀,最后我还没弄成功。(见下图)

  3. 我直接用 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;
}
posted @ 2022-11-30 20:56  白缺  阅读(645)  评论(0编辑  收藏  举报