c++、webServices、gsoap、tinyxml、iconv

c++、webServices、gsoap、tinyxml、iconv

大家好,又见面了,我是全栈君。

  背景解释。编程语言c++,实际项目上会用MFC,数据下载方式为gsoap,拉下来的数据类型为string,用tinyxml对拉下来的string类型进行解析,其中的中文字符都是乱码,用iconv来解码(from utf-8 to GBK)。

//main.cpp

 1 #include "AppServiceSoap.nsmap"
 2 #include "soapAppServiceSoapProxy.h"
 3 #include "iconv.h" 
 4 #include "tinystr.h"  
 5 #include "tinyxml.h"
 6 
 7 using namespace std;
 8 
 9 #define OUTPUT_LEN 2048
10 #define FIELD_LEN 16  
11 
12 int conv_charset(const char *dest, const char *src, char *input, size_t ilen, char *output, size_t olen)
13 {
14     iconv_t conv = iconv_open(dest, src);
15     if (conv == (iconv_t)-1)
16         return -1;
17     memset(output, 0, olen);
18 
19     if (iconv(conv, (const char **)&input, &ilen, &output, &olen))
20         return -1;
21     iconv_close(conv);
22     return 0;
23 }
24 
25 int main()
26 {
27     AppServiceSoapProxy webservice;
28     soap_init(webservice.soap);
29     soap_set_mode(webservice.soap, SOAP_C_UTFSTRING);
30 
31     _WS1__SampleDataByBarCodeNoXML request = _WS1__SampleDataByBarCodeNoXML();
32     string tmp = "18010354204";
33     request.sSampleBarCodeNo = &tmp;
34 
35     _WS1__SampleDataByBarCodeNoXMLResponse response = _WS1__SampleDataByBarCodeNoXMLResponse();
36 
37     char *endpoint = NULL;
38 
39     int result = webservice.SampleDataByBarCodeNoXML(&request, response);
40     
41     if (SOAP_OK == result)
42     {
43         //int element_counter = response.SampleDataByBarCodeNoXMLResult->__sizestring;
44         cout << *response.SampleDataByBarCodeNoXMLResult <<endl;
45         cout << "--------------------开始解码--------------------" << endl;
46         
47         TiXmlDocument* myDocument = new TiXmlDocument();
48         myDocument->Parse((*(response.SampleDataByBarCodeNoXMLResult)).c_str(), 0, TIXML_ENCODING_UTF8);
49         TiXmlElement* rootElement = myDocument->RootElement();
50         TiXmlElement* studentsElement = rootElement->FirstChildElement();
51         studentsElement = studentsElement->FirstChildElement();
52     
53         while (studentsElement)
54         {
55             cout << studentsElement->Value() << ":";
56 
57             if (studentsElement->GetText())
58             {
59                 int ilen = strlen(studentsElement->GetText());
60                 int olen = ilen * 2;
61                 char *output = (char *)malloc(sizeof(char) * olen);
62                 char* input = nullptr;                       //初始化char*类型
63 
64                 input = const_cast<char*>(studentsElement->GetText());           //const char*类型转char*类型
65 
66                 conv_charset("GBK", "UTF-8", input, ilen, output, olen);
67                 cout << output << endl;
68             }
69             else
70             {
71                 cout << "(此项无内容)" << endl;
72             }
73 
74             studentsElement->utf8ByteTable;
75 
76             //迭代下一个
77             studentsElement = studentsElement->NextSiblingElement();
78         }
79     }
80     //结束了
81     soap_destroy(webservice.soap);
82     soap_end(webservice.soap);
83     soap_done(webservice.soap);
84 
85     cout << "---------------------finish-----------------------" << endl;
86     cin.get();
87     return 0;
88 }

项目的目录结构。

c++、webServices、gsoap、tinyxml、iconv

主要分成3部分。

1、gsoap。

先做soap,这个参考上一篇。

2、tinyxml。

这个比较简单。

3、iconv.h,iconv.lib

这个好难。我都是用别人编译好的。

参考:https://www.cnblogs.com/tangxin-blog/p/5608751.html。

转载于:https://www.cnblogs.com/wuzhenyang/p/8523740.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107671.html原文链接:https://javaforall.net

(0)
上一篇 2022年3月13日 下午2:00
下一篇 2022年3月13日 下午2:00


相关推荐

  • 层次聚类算法的实现

    层次聚类算法的实现目录 1 作者介绍 2 层次聚类算法介绍 2 1 层次聚类算法原理 2 2 层次聚类算法步骤 2 3 层次聚类算法分类 3 层次聚类算法实现 代码如下 3 1 相关包导入 3 2 生成测试数据集 3 3 层次聚类实现 amp 画出树状图 3 4 获取聚类结果 3 5 对比不同方法聚类效果 4 参考链接 1 作者介绍杨金花 女 西安工程大学电子信息学院 21 级研究生研究方向 基于学习方法的运动目标检测电子邮件 com2 层次聚类算法介绍 2 1 层次聚类算法原理聚类就是对大量未知标注的数据集

    2026年3月18日
    1
  • Java中的lambda表达式如何理解——精简

    Java中的lambda表达式如何理解——精简在写之前 我在考虑是否要写这篇文章 然而当我查阅 lambda 表达式 的相关内容的时候 我发现大量的文章都出现了冗余的现象 文章的篇幅过于夸张 严重影响了大家阅读的兴趣 因此我决定写一篇关于 lambda 表达式的文章 让大家能够在一定程度上对 lambda 表达式有一定的理解 希望能够对你在 Java 的学习中起到一定的帮助

    2026年3月17日
    2
  • 左值引用和右值引用

    左值引用和右值引用在 C 11 中可以取地址的 有名字的就是左值 反之 不能取地址的 没有名字的就是右值 将亡值或纯右值 举个例子 inta b c a 就是左值 其有变量名为 a 通过 amp a 可以获取该变量的地址 表达式 b c 函数 intfunc 的返回值是右值 在其被赋值给某一变量前 我们不能通过变量名找到它 b c 这样的操作则不会通过编译 左值一定在内存中 右值有可能在内存中也有可能在寄存

    2026年3月17日
    2
  • SQL聚合函数「建议收藏」

    SQL聚合函数「建议收藏」一、知识点聚合函数对组执行计算并返回每个组唯一的值。GROUPBY子句通常与聚合函数一起用于统计数据。GROUPBY子句将行排列成组,聚合函数返回每个组的统计量。常用的聚合函数有:COUNT(),SUM(),AVG(),MIN(),MAX()。COUNT(),其作用主要是返回每个组的行数,也会返回有NULL值的列,可用于数字和字符列。SUM(),主要用于返回表达式中所有的总和,忽略NULL值,仅用于数字列。AVG(),返回表达式所有的平均值,仅用于数字列并且自动忽略NULL值。MIN(),返

    2022年6月21日
    24
  • 开源AI助理 openclaw(龙虾) 实战

    开源AI助理 openclaw(龙虾) 实战

    2026年3月12日
    2
  • build mdl app

    build mdl app

    2022年4月3日
    47

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号