landuochong 发表于 2011-12-21 08:44

使用gSOAP开发实例(5) libxml2解析SOAP响应消息

<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体;">转载:http://blog.csdn.net/yui/archive/2010/07/26/5767494.aspx</span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体;"><br></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">电信</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">provisioning</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">系统中,常常需要与远程服务器实时交换一些数据,以完成用户的请求。由于简单对象访问协议(</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Simple Object Access Protocol, SOAP</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">)的流行,许多涉及到第三方的应用,我们一般都比较乐意使用</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">SOAP</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">来开发。不过,由于可能涉及到公司的机密,本系列教程的开发实例尽量采用在网上已经公开的</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Web Service</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">资源。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Courier New';">前面四节的教程,分别采用了股票信息和天气预报的例子。而这两个实例有一个共同点,</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">SOAP</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Courier New';">响应消息的数据结构相对简单,只需要按拟定的次序,事先约定返回数据代表的意义,就能够实现无歧义的沟通。这就使得</span><span style="font-family: &quot;Courier New&quot;; mso-hansi-font-family: 'Times New Roman';" lang="EN-US">gSOAP</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Courier New';">能够以字符串数组的形式,定义返回结果,再加上一个整型变量,指示返回结果的个数。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: &quot;Courier New&quot;; mso-hansi-font-family: 'Times New Roman';" lang="EN-US"><span style="font-size: small;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Courier New';">查看一下这两个实例的</span><span style="font-family: &quot;Courier New&quot;; mso-hansi-font-family: 'Times New Roman';" lang="EN-US">soapStub.h</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Courier New';">,可以发现,它们的结果集定义正是这样的:</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;</p>

<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: &quot;Courier New&quot;; mso-hansi-font-family: 'Times New Roman';" lang="EN-US"><div class="dp-highlighter"><div class="bar"><div class="tools"><a href="http://blog.csdn.net/yui/archive/2010/07/26/5767494.aspx#">view plain</a><a href="http://blog.csdn.net/yui/archive/2010/07/26/5767494.aspx#">copy to clipboard</a><a href="http://blog.csdn.net/yui/archive/2010/07/26/5767494.aspx#">print</a><a href="http://blog.csdn.net/yui/archive/2010/07/26/5767494.aspx#">?</a></div></div><ol class="dp-cpp" start="1"><li class="alt"><span><span class="keyword">struct</span><span>&nbsp;ns1__ArrayOfString&nbsp;&nbsp;</span></span></li><li class=""><span>{&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="datatypes">int</span><span>&nbsp;__sizestring;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/*&nbsp;sequence&nbsp;of&nbsp;elements&nbsp;&lt;string&gt;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="datatypes">char</span><span>&nbsp;**string;&nbsp;&nbsp;</span><span class="comment">/*&nbsp;optional&nbsp;element&nbsp;of&nbsp;type&nbsp;xsd:string&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>};&nbsp;&nbsp;</span></li></ol></div><span style="font-size: small;"> </span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: &quot;Courier New&quot;; mso-hansi-font-family: 'Times New Roman';" lang="EN-US"></span></p>
<p><span style="font-family: &quot;Courier New&quot;; mso-hansi-font-family: 'Times New Roman';" lang="EN-US">
</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">但是,如果服务端返回的是一个相对复杂的结果集,事情就不那么好办了。例如,一个提供外汇汇率的</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Web Service</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">,服务端会同时返回日元、瑞郎、英镑、欧元、澳元、加元、港币合计七种货币兑换美元的汇率情报,每种汇率情报又包括货币代码、当前汇率、涨跌幅、买入价、卖出价、时间戳等多个子项。显然,这不是一个线性结构,而是一个树形结构,就不能使用</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ArrayOfString</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">来表示了。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">这个案例的</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">End point</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">是:</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US"><a href="http://webservice.webxml.com.cn/WebServices/ExchangeRateWebService.asmx"><span style="font-size: small;">http://webservice.webxml.com.cn/WebServices/ExchangeRateWebService.asmx</span></a></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">其</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">WSDL</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">是:</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US"><a href="http://webservice.webxml.com.cn/WebServices/ExchangeRateWebService.asmx?wsdl"><span style="font-size: small;">http://webservice.webxml.com.cn/WebServices/ExchangeRateWebService.asmx?wsdl</span></a></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">参考前面四节的内容,快速建立其存根程序,不再累述。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">&nbsp;</span></span></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">我们要实现的</span><span style="font-family: &quot;Courier New&quot;; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;" lang="EN-US">API</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">是</span><span style="font-family: &quot;Courier New&quot;; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;" lang="EN-US">getExchangeRate</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">,在</span><span style="font-family: &quot;Courier New&quot;; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;" lang="EN-US">soapStub.h</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">中搜索,可以发现其返回结果集最终的定义是:</span></span></p>

<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><div class="dp-highlighter"><div class="bar"><div class="tools"><a href="http://blog.csdn.net/yui/archive/2010/07/26/5767494.aspx#">view plain</a><a href="http://blog.csdn.net/yui/archive/2010/07/26/5767494.aspx#">copy to clipboard</a><a href="http://blog.csdn.net/yui/archive/2010/07/26/5767494.aspx#">print</a><a href="http://blog.csdn.net/yui/archive/2010/07/26/5767494.aspx#">?</a></div></div><ol class="dp-cpp" start="1"><li class="alt"><span><span class="keyword">struct</span><span>&nbsp;_ns1__getExchangeRateResponse_getExchangeRateResult&nbsp;&nbsp;</span></span></li><li class=""><span>{&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="datatypes">char</span><span>&nbsp;*xsd__schema;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/*&nbsp;required&nbsp;element&nbsp;of&nbsp;type&nbsp;xsd:schema&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="datatypes">char</span><span>&nbsp;*__any;&nbsp;&nbsp;</span></span></li><li class="alt"><span>};&nbsp;&nbsp;</span></li></ol></div><span style="font-size: small;"> </span></span></p>
<p class="MsoNormal"><span style="font-size: small;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><span style="font-size: small;">仅仅是两个字符串!于是,最初版本的外汇汇率客户端程序只能这样写:</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><div class="dp-highlighter"><div class="bar"><div class="tools"><a href="http://blog.csdn.net/yui/archive/2010/07/26/5767494.aspx#">view plain</a><a href="http://blog.csdn.net/yui/archive/2010/07/26/5767494.aspx#">copy to clipboard</a><a href="http://blog.csdn.net/yui/archive/2010/07/26/5767494.aspx#">print</a><a href="http://blog.csdn.net/yui/archive/2010/07/26/5767494.aspx#">?</a></div></div><ol class="dp-cpp" start="1"><li class="alt"><span><span class="preprocessor">#include&nbsp;&lt;iconv.h&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span><span class="preprocessor">#include&nbsp;"soapH.h"</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span><span class="preprocessor">#include&nbsp;"ExchangeRateWebServiceSoap12.nsmap"</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span><span class="datatypes">int</span><span>&nbsp;conv_charset(</span><span class="keyword">const</span><span>&nbsp;</span><span class="datatypes">char</span><span>&nbsp;*dest,&nbsp;</span><span class="keyword">const</span><span>&nbsp;</span><span class="datatypes">char</span><span>&nbsp;*src,&nbsp;</span><span class="datatypes">char</span><span>&nbsp;*input,&nbsp;</span><span class="datatypes">size_t</span><span>&nbsp;ilen,&nbsp;</span><span class="datatypes">char</span><span>&nbsp;*output,&nbsp;</span><span class="datatypes">size_t</span><span>&nbsp;olen)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;iconv_t&nbsp;conv&nbsp;=&nbsp;iconv_open(dest,&nbsp;src);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(&nbsp;conv&nbsp;==&nbsp;(iconv_t)&nbsp;-1&nbsp;)&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;-1;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;memset(output,&nbsp;0,&nbsp;olen);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(&nbsp;iconv(conv,&nbsp;&amp;input,&nbsp;&amp;ilen,&nbsp;&amp;output,&nbsp;&amp;olen)&nbsp;)&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;-1;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;iconv_close(conv);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;0;&nbsp;&nbsp;</span></span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span><span class="datatypes">int</span><span>&nbsp;main(</span><span class="datatypes">int</span><span>&nbsp;argc,&nbsp;</span><span class="datatypes">char</span><span>&nbsp;**argv)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(&nbsp;argc&nbsp;!=&nbsp;2&nbsp;&amp;&amp;&nbsp;argc&nbsp;!=&nbsp;3&nbsp;)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(<span class="string">"Usage:&nbsp;%s&nbsp;type&nbsp;\n"</span><span>,&nbsp;argv);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(<span class="string">"\ttype&nbsp;=&nbsp;A&nbsp;:&nbsp;all&nbsp;rate\n"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(<span class="string">"\ttype&nbsp;=&nbsp;B&nbsp;:&nbsp;basic&nbsp;rate\n"</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(<span class="string">"\ttype&nbsp;=&nbsp;C&nbsp;:&nbsp;cross&nbsp;rate\n"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(-1);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">struct</span><span>&nbsp;soap&nbsp;soap;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;soap_init(&amp;soap);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;don't&nbsp;set&nbsp;is&nbsp;OK</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//soap_set_mode(&amp;soap,&nbsp;SOAP_C_UTFSTRING);</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">struct</span><span>&nbsp;_ns1__getExchangeRate&nbsp;request;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">struct</span><span>&nbsp;_ns1__getExchangeRateResponse&nbsp;response;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;request.theType&nbsp;=&nbsp;argv;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="datatypes">char</span><span>&nbsp;*endpoint&nbsp;=&nbsp;NULL;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(&nbsp;argc&nbsp;==&nbsp;3&nbsp;)&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endpoint&nbsp;=&nbsp;argv;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(&nbsp;soap_call___ns3__getExchangeRate(&amp;soap,&nbsp;endpoint,&nbsp;NULL,&nbsp;&amp;request,&nbsp;&amp;response)&nbsp;==&nbsp;SOAP_OK&nbsp;)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(<span class="string">"%s\n"</span><span>,&nbsp;response.getExchangeRateResult-&gt;xsd__schema);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(<span class="string">"----------\n"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="datatypes">int</span><span>&nbsp;ilen&nbsp;=&nbsp;strlen(response.getExchangeRateResult-&gt;__any);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="datatypes">int</span><span>&nbsp;olen&nbsp;=&nbsp;ilen&nbsp;*&nbsp;2;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="datatypes">char</span><span>&nbsp;*output&nbsp;=&nbsp;(</span><span class="datatypes">char</span><span>&nbsp;*)&nbsp;malloc(</span><span class="keyword">sizeof</span><span>(</span><span class="datatypes">char</span><span>)&nbsp;*&nbsp;olen);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conv_charset(<span class="string">"GBK"</span><span>,&nbsp;</span><span class="string">"UTF-8"</span><span>,&nbsp;response.getExchangeRateResult-&gt;__any,&nbsp;ilen,&nbsp;output,&nbsp;olen);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(<span class="string">"%s\n"</span><span>,&nbsp;output);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(output);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;soap_print_fault(&amp;soap,&nbsp;stderr);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;soap_destroy(&amp;soap);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;soap_end(&amp;soap);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;soap_done(&amp;soap);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;0;&nbsp;&nbsp;</span></span></li><li class=""><span>}&nbsp;&nbsp;</span></li></ol></div><span style="font-size: small;"> </span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"></span></p>
<p><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">
</span></span></p><p class="MsoNormal"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">其中,</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">xsd__schema</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">没有中文字符,而</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">__any</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">含有中文字符,需要转换成</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">GBK</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">编码,具体可以参考前面两节。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><span style="font-size: small;">编译执行,输出结果如下图:</span></span></p>
<p class="MsoNormal"><span style="font-size: small;">&nbsp;</span></p>

<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><span style="font-size: small;"><img src="http://hi.csdn.nethttp://blog.chinaunix.net/attachment/201007/26/0_1280154201f2nH.gif" alt=""></span></span></p>
<p class="MsoNormal"><span style="font-size: small;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">可以看出,服务端返回的两个长字符串实际上都是基于</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">XML</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">形式的。</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">gSOAP</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">能够自动帮我们完成的也就到此为止,剩下的需要我们自力更生了。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">不过,大家也不用头疼,我们还有另外一个利器——</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">libxml2</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">!网上有很多关于</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">libxml2</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">的教程,所以我也不必多说,只要利用其中几个函数和语句即可。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">&nbsp;</span></span></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">1.<span style="font-weight: normal; line-height: normal; font-style: normal; font-family: &quot;Times New Roman&quot;; font-variant: normal;">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">xmlParseMemory</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">,字符串转为</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">XML</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">文档</span></span></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">2.<span style="font-weight: normal; line-height: normal; font-style: normal; font-family: &quot;Times New Roman&quot;; font-variant: normal;">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">xmlDocGetRootElement</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">,获取</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">XML</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">文档根节点</span></span></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">3.<span style="font-weight: normal; line-height: normal; font-style: normal; font-family: &quot;Times New Roman&quot;; font-variant: normal;">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">xmlStrcmp</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">,比较</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">XML</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">字符串,与</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">strcmp</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">差不多</span></span></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">4.<span style="font-weight: normal; line-height: normal; font-style: normal; font-family: &quot;Times New Roman&quot;; font-variant: normal;">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">curr = curr-&gt;xmlChildrenNode</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">,</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">XML</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">节点指针指向第一个子节点</span></span></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">5.<span style="font-weight: normal; line-height: normal; font-style: normal; font-family: &quot;Times New Roman&quot;; font-variant: normal;">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">curr = curr-&gt;next</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">,</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">XML</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">节点指针指向下一个兄弟节点</span></span></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">6.<span style="font-weight: normal; line-height: normal; font-style: normal; font-family: &quot;Times New Roman&quot;; font-variant: normal;">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">xmlNodeGetContent</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">,获取</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">XML</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">节点的内容</span></span></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">7.<span style="font-weight: normal; line-height: normal; font-style: normal; font-family: &quot;Times New Roman&quot;; font-variant: normal;">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">xmlFreeDoc</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">,释放节点,与</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">free</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">差不多</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">&nbsp;</span></span></p>
<p class="MsoNormal"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">最终的外汇汇率客户端程序如下:</span></span></p>
<p class="MsoNormal"><span style="font-size: small;">&nbsp;</span></p>
<div class="dp-highlighter"><div class="bar"><div class="tools"><a href="http://blog.csdn.net/yui/archive/2010/07/26/5767494.aspx#">view plain</a><a href="http://blog.csdn.net/yui/archive/2010/07/26/5767494.aspx#">copy to clipboard</a><a href="http://blog.csdn.net/yui/archive/2010/07/26/5767494.aspx#">print</a><a href="http://blog.csdn.net/yui/archive/2010/07/26/5767494.aspx#">?</a></div></div><ol class="dp-cpp" start="1"><li class="alt"><span><span class="preprocessor">#include&nbsp;&lt;iconv.h&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span><span class="preprocessor">#include&nbsp;&lt;libxml/parser.h&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="preprocessor">#include&nbsp;&lt;libxml/xmlmemory.h&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span><span class="preprocessor">#include&nbsp;"soapH.h"</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span><span class="preprocessor">#include&nbsp;"ExchangeRateWebServiceSoap12.nsmap"</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span><span class="preprocessor">#define&nbsp;FIELD_LEN&nbsp;16</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span><span class="datatypes">int</span><span>&nbsp;conv_charset(</span><span class="keyword">const</span><span>&nbsp;</span><span class="datatypes">char</span><span>&nbsp;*dest,&nbsp;</span><span class="keyword">const</span><span>&nbsp;</span><span class="datatypes">char</span><span>&nbsp;*src,&nbsp;</span><span class="datatypes">char</span><span>&nbsp;*input,&nbsp;</span><span class="datatypes">size_t</span><span>&nbsp;ilen,&nbsp;</span><span class="datatypes">char</span><span>&nbsp;*output,&nbsp;</span><span class="datatypes">size_t</span><span>&nbsp;olen)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;iconv_t&nbsp;conv&nbsp;=&nbsp;iconv_open(dest,&nbsp;src);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(&nbsp;conv&nbsp;==&nbsp;(iconv_t)&nbsp;-1&nbsp;)&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;-1;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;memset(output,&nbsp;0,&nbsp;olen);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(&nbsp;iconv(conv,&nbsp;&amp;input,&nbsp;&amp;ilen,&nbsp;&amp;output,&nbsp;&amp;olen)&nbsp;)&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;-1;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;iconv_close(conv);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;0;&nbsp;&nbsp;</span></span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span><span class="datatypes">int</span><span>&nbsp;main(</span><span class="datatypes">int</span><span>&nbsp;argc,&nbsp;</span><span class="datatypes">char</span><span>&nbsp;**argv)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(&nbsp;argc&nbsp;!=&nbsp;2&nbsp;&amp;&amp;&nbsp;argc&nbsp;!=&nbsp;3&nbsp;)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(<span class="string">"Usage:&nbsp;%s&nbsp;type&nbsp;\n"</span><span>,&nbsp;argv);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(<span class="string">"\ttype&nbsp;=&nbsp;A&nbsp;:&nbsp;all&nbsp;rate\n"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(<span class="string">"\ttype&nbsp;=&nbsp;B&nbsp;:&nbsp;basic&nbsp;rate\n"</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(<span class="string">"\ttype&nbsp;=&nbsp;C&nbsp;:&nbsp;cross&nbsp;rate\n"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(-1);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">struct</span><span>&nbsp;soap&nbsp;soap;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;soap_init(&amp;soap);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;don't&nbsp;set&nbsp;is&nbsp;OK</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//soap_set_mode(&amp;soap,&nbsp;SOAP_C_UTFSTRING);</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">struct</span><span>&nbsp;_ns1__getExchangeRate&nbsp;request;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">struct</span><span>&nbsp;_ns1__getExchangeRateResponse&nbsp;response;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;request.theType&nbsp;=&nbsp;argv;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="datatypes">char</span><span>&nbsp;*endpoint&nbsp;=&nbsp;NULL;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(&nbsp;argc&nbsp;==&nbsp;3&nbsp;)&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endpoint&nbsp;=&nbsp;argv;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(&nbsp;soap_call___ns3__getExchangeRate(&amp;soap,&nbsp;endpoint,&nbsp;NULL,&nbsp;&amp;request,&nbsp;&amp;response)&nbsp;==&nbsp;SOAP_OK&nbsp;)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="datatypes">int</span><span>&nbsp;len&nbsp;=&nbsp;strlen(response.getExchangeRateResult-&gt;__any);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlDocPtr&nbsp;pdoc&nbsp;=&nbsp;xmlParseMemory(response.getExchangeRateResult-&gt;__any,&nbsp;len);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlNodePtr&nbsp;root&nbsp;=&nbsp;xmlDocGetRootElement(pdoc);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlNodePtr&nbsp;curr&nbsp;=&nbsp;root;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">while</span><span>&nbsp;(&nbsp;xmlStrcmp(curr-&gt;name,&nbsp;(</span><span class="keyword">const</span><span>&nbsp;xmlChar&nbsp;*)&nbsp;</span><span class="string">"getExchangeRate"</span><span>)&nbsp;)&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curr&nbsp;=&nbsp;curr-&gt;xmlChildrenNode;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(&nbsp;curr&nbsp;=&nbsp;curr-&gt;xmlChildrenNode;&nbsp;curr;&nbsp;curr&nbsp;=&nbsp;curr-&gt;next&nbsp;)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlNodePtr&nbsp;data;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(&nbsp;data&nbsp;=&nbsp;curr-&gt;xmlChildrenNode;&nbsp;data;&nbsp;data&nbsp;=&nbsp;data-&gt;next&nbsp;)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="datatypes">char</span><span>&nbsp;ifield;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="datatypes">char</span><span>&nbsp;ofield;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy(ifield,&nbsp;xmlNodeGetContent(data));&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(&nbsp;conv_charset(</span><span class="string">"GBK"</span><span>,&nbsp;</span><span class="string">"UTF-8"</span><span>,&nbsp;ifield,&nbsp;strlen(ifield),&nbsp;ofield,&nbsp;FIELD_LEN)&nbsp;)&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(<span class="string">"%s\t%s\n"</span><span>,&nbsp;data-&gt;name,&nbsp;ifield);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(<span class="string">"%s\t%s\n"</span><span>,&nbsp;data-&gt;name,&nbsp;ofield);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(<span class="string">"\n"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlFreeDoc(pdoc);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;soap_print_fault(&amp;soap,&nbsp;stderr);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;soap_destroy(&amp;soap);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;soap_end(&amp;soap);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;soap_done(&amp;soap);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;0;&nbsp;&nbsp;</span></span></li><li class=""><span>}&nbsp;&nbsp;</span></li></ol></div><span style="font-size: small;"> </span>
<p class="MsoNormal"><span style="font-size: small;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">编译时,需要链接</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">libxml2</span><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">库,同时指定头文件所在路径:</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong style="mso-bidi-font-weight: normal;"><span style="color: blue; font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">gcc -O2 -o exchange exchange.c soapC.c soapClient.c ../../stdsoap2.c -I../.. -I/usr/include/libxml2 -L../.. -lgsoap -lxml2</span></span></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">执行结果(部分)如下:</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">-bash-3.2$ <strong style="mso-bidi-font-weight: normal;"><span style="color: blue;">./exchange B</span></strong></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: green; font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">Code<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp; </span>JPY</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="color: green; font-family: &quot;Courier New&quot;;" lang="EN-US">Currency<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="color: green; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">日元</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: green; font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">ClosePrice<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>87.08</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: green; font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">DiffPercent<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp; </span>-0.29%</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: green; font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">DiffAmount<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>-0.25</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: green; font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">OpenPrice<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>87.5</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: green; font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">HighPrice<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>87.71</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: green; font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">LowPrice<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>87.04</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: green; font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">Range<span style="mso-spacerun: yes;">&nbsp;&nbsp; </span>0.77%</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: green; font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">BuyPrice<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>87.08</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: green; font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">SellPrice<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>87.12</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: green; font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">ChangeColor<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp; </span>Green</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: green; font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">DataTime<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16:57:54</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: green; font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: green; font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">Code</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: green; font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">CHF</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="color: green; font-family: &quot;Courier New&quot;;" lang="EN-US">Currency<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="color: green; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">瑞郎</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: green; font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">ClosePrice<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>1.0552</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: green; font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">DiffPercent<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp; </span>0.16%</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: green; font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">DiffAmount<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>0.0017</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: green; font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">OpenPrice<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>1.054</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: green; font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">HighPrice<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>1.0552</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: green; font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">LowPrice<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>1.0498</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: green; font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">Range<span style="mso-spacerun: yes;">&nbsp;&nbsp; </span>0.51%</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: green; font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">BuyPrice<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>1.0552</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: green; font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">SellPrice<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>1.0556</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: green; font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">ChangeColor<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp; </span>Red</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: green; font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="font-size: small;">DataTime<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16:57:52</span></span></p>
               
               
               
               
页: [1]
查看完整版本: 使用gSOAP开发实例(5) libxml2解析SOAP响应消息