boost解析xml C++

2023-11-02


```cpp
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <boost/typeof/typeof.hpp>

#include <sstream>
#include <iostream>
#include <string>


//转码才用到
#include <Windows.h>
#include <WinNls.h>
#include <wchar.h>
#include <stringapiset.h>

//<?xml version="1.0" encoding="UTF-8"?>
//<aa>
//	<bb>
//		<cc>1.0</cc>
//		<dd>1.0</dd>
//	</bb>
//</aa> 

std::string Utf8ToGbk(const char* src_str)//中文感觉还是有问题
{
	int len = MultiByteToWideChar(CP_UTF8, 0, src_str, -1, NULL, 0);
	wchar_t* wszGBK = new wchar_t[len + 1];
	memset(wszGBK, 0, len * 2 + 2);
	MultiByteToWideChar(CP_UTF8, 0, src_str, -1, wszGBK, len);
	len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
	char* szGBK = new char[len + 1];
	memset(szGBK, 0, len + 1);
	WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, szGBK, len, NULL, NULL);
	std::string strTemp(szGBK);
	if (wszGBK) delete[] wszGBK;
	if (szGBK) delete[] szGBK;
	return strTemp;
}
void GBKToUTF8(char* szOut)
{
	char* strGBK = szOut;

	int len = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)strGBK, -1, NULL, 0);
	unsigned short* wszUtf8 = new unsigned short[len + 1];
	memset(wszUtf8, 0, len * 2 + 2);
	MultiByteToWideChar(CP_ACP, 0, (LPCSTR)strGBK, -1, (LPWSTR)wszUtf8, len);

	len = WideCharToMultiByte(CP_UTF8, 0, (LPWSTR)wszUtf8, -1, NULL, 0, NULL, NULL);
	char* szUtf8 = new char[len + 1];
	memset(szUtf8, 0, len + 1);
	WideCharToMultiByte(CP_UTF8, 0, (LPWSTR)wszUtf8, -1, szUtf8, len, NULL, NULL);

	//szOut = szUtf8;
	memset(szOut, 0, strlen(szUtf8) + 1);
	memcpy(szOut, szUtf8, strlen(szUtf8));

	delete[] szUtf8;
	delete[] wszUtf8;
}
//将string转换成wstring  
std::wstring StringToWstring(const std::string& str)
{
	std::wstring result;
	//获取缓冲区大小,并申请空间,缓冲区大小按字符计算  
	int len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), NULL, 0);
	TCHAR* buffer = new TCHAR[len + 1];
	//多字节编码转换成宽字节编码  
	MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), buffer, len);
	buffer[len] = '\0';             //添加字符串结尾  
									//删除缓冲区并返回值  
	result.append(buffer);
	delete[] buffer;
	return std::move(result);
}

//将wstring转换成string  
std::string WstringToString(const std::wstring& wstr)
{
	std::string result;
	//获取缓冲区大小,并申请空间,缓冲区大小事按字节计算的  
	int len = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), NULL, 0, NULL, NULL);
	char* buffer = new char[len + 1];
	//宽字节编码转换成多字节编码  
	WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), buffer, len, NULL, NULL);
	buffer[len] = '\0';
	//删除缓冲区并返回值  
	result.append(buffer);
	delete[] buffer;
	return std::move(result);
}
int main()
{
try {
    boost::property_tree::ptree xmlpt;

	//boost解析 gbk
    //std::string aaa = "<?xml version=\"1.0\" encoding=\"GBK\"?><Message><MessageHeader><Version>1.0</Version><From></From><System></System></MessageHeader><MessageBody Type = \"Snap\"><ID>哈哈</ID><LaneNo>啊的布局方式是否还款时间 </LaneNo></MessageBody></Message>";
    //std::stringstream b;
    //b << aaa;
    //boost::property_tree::read_xml(b, xmlpt);
	//std::string a = xmlpt.get<std::string>("Message.MessageBody.ID", "100");
	//std::string ab = xmlpt.get<std::string>("Message.MessageBody.LaneNo", "100");
	//std::cout << a.c_str();
	//std::cout << ab.c_str();
	
	//boost解析 gbk
	boost::property_tree::read_xml("C:\\Data\\1.txt", xmlpt);//utf-8文件
    std::string a = xmlpt.get<std::string>("aa.bb.cc","100");
    std::string ab = xmlpt.get<std::string>("aa.bb.dd", "100");
    std::cout << Utf8ToGbk(a.c_str());
	std::cout << Utf8ToGbk(ab.c_str());
	}
	catch (...)
	{
		std::cout << "parse err!" << std::endl;
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

boost解析xml C++ 的相关文章

随机推荐

  • JAVA必背面试题和项目面试通关要点、、

    原帖地址 http www cnblogs com hoobey p 5954292 html 3822951 一 数据库 1 常问数据库查询 修改 SQL查询包含筛选查询 聚合查询和链接查询和优化问题 手写SQL语句 例如四个球队比赛 用
  • 【SQL】16 SQL CREATE INDEX 语句、 撤销索引、撤销表以及撤销数据库、ALTER TABLE 语句、AUTO INCREMENT 字段

    SQL CREATE INDEX 语句 CREATE INDEX 语句用于在表中创建索引 在不读取整个表的情况下 索引使数据库应用程序可以更快地查找数据 索引 您可以在表中创建索引 以便更加快速高效地查询数据 用户无法看到索引 它们只能被用
  • 【Yarn】Yarn MapReduce 程序开发

    文章目录 1 概述 2 MapReduce程序提交到yarn 3 clinet提交任务到Server端 4 Yarn启动AppMaster 5 调度执行应用程序进程 1 概述 上一篇文章 Yarn Yarn 应用开发之Client开发 Ap
  • 一分钟了解"matlab进行奇异值分解SVD"

    U S V svd X 结果满足 X U S V
  • 使用dom4j 生成xml UTF-8 编码错误之解决

    文件名称 String fileName
  • 红外图像处理:改进的直方图

    红外图像处理 改进的直方图 红外领域 常用直方图拉伸来进行14bit数据到8bit数据的转换 以方便显示 传统直方图拉伸算法存在如下问题 1 对于红外图像 细节丢失严重 2 图像柔和度不够 人感观不理想 我们在分析红外数据特点 结合各种实际
  • vue-cli 生产模式去除 console.log

    preface 最近项目接近尾声 开始着手项目加载优化操作 简要如下 大的背景图 进行了在线压缩 第三方引用的模块使用 cdn引入 如 vue elementui echarts 异步加载 页面 和 某些 css 或者 js 比较大的模块
  • 日期时间范围方法

    需求 当前日期或指定日期所在的整年 整季度 整月 当前日期或指定日期所在的上一年 上个季度 上个月 注 这里的整月不是固定的30天 是根据下个月的第一天倒推的 年份季度同理 最简单的获取当前日期或指定日期整月 eslint disable
  • 前后端数据交互

    前后端数据交互 前后端数据交互方式有三种 1 form表单 2 ajax 3 websocket form表单
  • 18年西工大硕士研究生入学考试复试机试解答

    Headline 18年瓜大机试解答 Author 周小枫 Email weijinxiong ncu outlook com Date 2019 1 4 Brief 这是一份菜鸡帮更菜的鸡写的参 考code 经测试 以下code都OK 如
  • priority_queue元素为指针时,重载运算符失效

    使用priority queue构造最大最小堆时 发现priority queue中元素为指针时 std greater std less函数并不能调用到自定义数据的重载运算符 排序结果是根据指针地址大小计算的 从而导致最大最小堆失效 in
  • 测试用例设计——边界值分析法

    在前面的测试用例设计 等价类划分法中 我们使用等价类划分法给两位数加法器设计了测试用例 但在测试过程中我们发现了一个问题 为什么我们用等价类法设计的测试用例没有发现这个问题呢 查看一下代码 发现程序员粗心 边界条件设置错误了 无数的测试实践
  • Mac升级go

    目录 升级流程 卸载 安装 升级流程 在Mac中对go版本的升级采用先卸载后安装的过程进行go版本升级 或者回退 卸载 在卸载前 先查看下当前的go版本 go version go version go1 14 5 darwin amd64
  • cgroup小结

    安装cgroup yum install libcgroup 配置cgroup config文件 vim etc cgconfig conf mount cpuset cgroup cpuset cpu cgroup cpu cpuacct
  • 【订单分批】基于萤火虫算法求解订单分批问题附matlab代码

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 内容介绍 一种基于群体智能优化算法的订单分批方法 包括如下步骤 1 建立以订单方案的总行走距离
  • DNS报文格式解析

    DNS分为查询请求和查询响应 请求和响应的报文结构基本相同 基础结构部分 报文首部 事物ID DNS报文的ID表示 对于请求报文和其对应的应答报文 该字段的值是相同的 通过它可以区分 DNS 应答报文是对哪个请求进行响应的 标志 DNS 报
  • Vue props传参获取失败解决方法

    文章目录 问题背景 解决方法 总结 问题背景 在父组件 通过ajax请求给controlManage赋值 再将值传到Test子组件 子组件在created mounted方法均获取不到数据
  • 使用R语言对指定列进行开根号并生成新的数据列

    使用R语言对指定列进行开根号并生成新的数据列 在R语言中 我们经常需要对数据进行各种数学运算和转换 其中一项常见的操作是对指定列进行开根号并生成新的数据列 本文将介绍如何使用R语言实现这个操作 假设我们有一个名为 data 的数据框 其中包
  • Sublime Text入门使用教程

    简介 说到最好用的编辑器 首推Sublime 感觉比notepad 胜出无数倍 支持 Windows 及 Mac 等多平台 类似于 Eclipse IDEA 有着丰富的插件系统 完全可以满足各种编辑 开发需求 强烈建议安装或者升级到最新版
  • boost解析xml C++

    cpp include