webservice

 Connector->Property["EndPointURL"] = "http://www.wopos.com/webservice/weather.asmx";

 

Connector->Property["SoapAction"] = "http://tempuri.org/getWeather";

 

Serializer->StartElement("getWeather",http://tempuri.org/,"","");

 

http://topic.csdn.net/t/20050308/13/3833763.html

http://www.sudu.cn/info/html/edu/20080403/259642.html

http://www.cnblogs.com/sadier/articles/99904.html

http://hi.baidu.com/meihuaxue/blog/item/5801593493c5ce48251f1490.html

假如Webservice提供的方法是:int SimpleMath.Add(int n1,int n2),返回值是n1+n2

// Build the SOAP Message
 Serializer->startEnvelope("","","");
 Serializer->startBody("");
 Serializer->startElement("Add","http://tempuri.org/","","");
 Serializer->startElement("n1","","","");
 Serializer->writeString("5");
 Serializer->endElement();
 Serializer->startElement("n2","","","");
 Serializer->writeString("10");
 Serializer->endElement();
 Serializer->endElement();
 Serializer->endBody();
 Serializer->endEnvelope();

 

简单的实例程序

  1. #include <atlbase.h>   
  2. //下面的.h文件是在安装了最新的XML Parser以后所包含的.h文件。   
  3. #include "C:\Program Files\Microsoft XML Parser SDK\inc\msxml2.h"  
  4. #include <iostream>   
  5. void main()   
  6. {   
  7. // 初始化COM接口   
  8. CoInitialize(NULL);   
  9. //在程序中,我们假定我们装载的XML文件名称为xmldata.xml,它缺省的和可执行文  
  10. //件在同一个目录中。该文件的内容如下:   
  11. // <?xml version="1.0"?>   
  12. // <xmldata>   
  13. // <xmlnode />   
  14. // <xmltext>Hello, World!</ xmltext>   
  15. // </xmldata>   
  16. //   
  17. //程序将寻找名为“xmlnode”的节点,然后插入一个新的名称为“xmlchildnode”的  
  18. //节点,然后它去寻找一个名为“xmltest”的节点,然后提取包含在节点中的文本并显   
  19. //示它。最后它把新的改变过的XML文档保存在名称为“updatexml.xml”的文档中。  
  20. try {   
  21. // 通过智能指针创建一个解析器的实例。   
  22. CComPtr<IXMLDOMDocument> spXMLDOM;   
  23. HRESULT hr = spXMLDOM.CoCreateInstance(__uuidof(DOMDocument));   
  24. if ( FAILED(hr) ) throw"不能创建XML Parser对象";   
  25. if ( spXMLDOM.p == NULL ) throw "不能创建XML Parser对象";   
  26. // 如果对象创建成功的话,就开始装载XML文档   
  27. VARIANT_BOOL bSuccess = false;   
  28. hr = spXMLDOM->load(CComVariant(L"xmldata.xml"),&bSuccess);   
  29. if ( FAILED(hr) ) throw"不能够在解析器中装载XML文档";   
  30. if ( !bSuccess ) throw"不能够在解析器中装载XML文档";   
  31. // 检查并搜索"xmldata/xmlnode"   
  32. CComBSTR bstrSS(L"xmldata/xmlnode");   
  33. CComPtr<IXMLDOMNode> spXMLNode;   
  34. //用接口IXMLDOMDocument的方法selectSingleNode方法定位该节点   
  35. hr = spXMLDOM->selectSingleNode(bstrSS,&spXMLNode);   
  36. if ( FAILED(hr) ) throw"不能在XML节点中定位'xmlnode' ";   
  37. if ( spXMLNode.p == NULL ) throw "不能在XML节点中定位'xmlnode' ";   
  38. //DOM对象“spXMLNode”现在包含了XML节点<xmlnode>,所以我们可以在   
  39. //它下面创建一个子节点并把找到的该节点作为它的父节点。   
  40. CComPtr<IXMLDOMNode> spXMLChildNode;   
  41. //用接口IXMLDOMDocument的方法createNode方法创建一个新节点。  
  42. hr = spXMLDOM->createNode(   
  43. CComVariant(NODE_ELEMENT),   
  44. CComBSTR("xmlchildnode"),   
  45. NULL,&spXMLChildNode);   
  46. if ( FAILED(hr) ) throw"不能创建'xmlchildnode' 节点";   
  47. if ( spXMLChildNode.p == NULL )   
  48. throw "不能创建'xmlchildnode' 节点";   
  49. //添加新节点到spXMLNode节点下去。   
  50. CComPtr<IXMLDOMNode> spInsertedNode;   
  51. hr = spXMLNode->appendChild(spXMLChildNode,&spInsertedNode);   
  52. if ( FAILED(hr) ) throw"不能创建'xmlchildnode' 节点";   
  53. if ( spInsertedNode.p == NULL )throw "不能移动'xmlchildnode' 节点";   
  54. //对新节点添加属性。   
  55. CComQIPtr<IXMLDOMElement> spXMLChildElement;   
  56. spXMLChildElement = spInsertedNode;   
  57. if ( spXMLChildElement.p == NULL )   
  58. throw "不能在XML元素接口中查询到'xmlchildnode' ";   
  59. //设置新节点的属性   
  60. hr = spXMLChildElement->setAttribute(CComBSTR(L"xml"),CComVariant(L"fun"));   
  61. if ( FAILED(hr) ) throw"不能插入新的属性";   
  62. //下面的程序段用来寻找一个节点并显示该节点的相关信息   
  63. // 查找"xmldata/xmltext"节点   
  64. spXMLNode = NULL; // 释放先前的节点   
  65. bstrSS = L"xmldata/xmltext";   
  66. hr = spXMLDOM->selectSingleNode(bstrSS,&spXMLNode);   
  67. if ( FAILED(hr) ) throw"不能定位'xmltext'节点";   
  68. if ( spXMLNode.p == NULL ) throw"不能定位'xmltext'节点";   
  69. // 得到该节点包含的文本并显示它   
  70. CComVariant varValue(VT_EMPTY);   
  71. hr = spXMLNode->get_nodeTypedValue(&varValue);   
  72. if ( FAILED(hr) ) throw"不能提取'xmltext'文本";   
  73. if ( varValue.vt == VT_BSTR ) {   
  74. // 显示结果,注意这里要把字符串从形式BSTR转化为ANSI   
  75. USES_CONVERSION;   
  76. LPTSTR lpstrMsg = W2T(varValue.bstrVal);   
  77. std::cout << lpstrMsg << std::endl;   
  78. } // if   
  79. else {   
  80. // 如果出现错误   
  81. throw "不能提取'xmltext'文本";   
  82. } // else   
  83. //保存修改过的XML文档到指定的文档名   
  84. hr = spXMLDOM->save(CComVariant("updatedxml.xml"));   
  85. if ( FAILED(hr) ) throw"不能保存修改过的XML文档";   
  86. std::cout << "处理完成..." << std::endl << std::endl;   
  87. } // try   
  88. catch(char* lpstrErr) {   
  89. // 出现错误   
  90. std::cout << lpstrErr << std::endl << std::endl;   
  91. } // catch   
  92. catch(...) {   
  93. // 未知错误   
  94. std::cout << "未知错误..." << std::endl << std::endl;   
  95. } // catch   
  96. // 结束对COM的使用   
  97. CoUninitialize();   
  98. }   

题解决:
比较一下vs.net中发出的请求,差别在哪里?认真看一下,n1和n2没有指定命名空间,那么就指定一下吧。
把代码改成:


 Serializer->startElement("Add","http://tempuri.org/","NONE","");
 Serializer->startElement("n1","http://tempuri.org/","NONE","");
 Serializer->writeString("5");
 Serializer->endElement();
 Serializer->startElement("n2","http://tempuri.org/","NONE","");
 Serializer->writeString("10");
 Serializer->endElement();
 Serializer->endElement();

测试结果正常了,返回15。

看看这时候发出的xml数据:
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
 <SOAP-ENV:Body SOAP-ENV:encodingStyle="">
 <SOAPSDK1:Add xmlns:SOAPSDK1="http://tempuri.org/">
  <SOAPSDK1:n1>5</SOAPSDK1:n1>
  <SOAPSDK1:n2>10</SOAPSDK1:n2>
  </SOAPSDK1:Add>
  </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值