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();
简单的实例程序
- #include <atlbase.h>
- //下面的.h文件是在安装了最新的XML Parser以后所包含的.h文件。
- #include "C:\Program Files\Microsoft XML Parser SDK\inc\msxml2.h"
- #include <iostream>
- void main()
- {
- // 初始化COM接口
- CoInitialize(NULL);
- //在程序中,我们假定我们装载的XML文件名称为xmldata.xml,它缺省的和可执行文
- //件在同一个目录中。该文件的内容如下:
- // <?xml version="1.0"?>
- // <xmldata>
- // <xmlnode />
- // <xmltext>Hello, World!</ xmltext>
- // </xmldata>
- //
- //程序将寻找名为“xmlnode”的节点,然后插入一个新的名称为“xmlchildnode”的
- //节点,然后它去寻找一个名为“xmltest”的节点,然后提取包含在节点中的文本并显
- //示它。最后它把新的改变过的XML文档保存在名称为“updatexml.xml”的文档中。
- try {
- // 通过智能指针创建一个解析器的实例。
- CComPtr<IXMLDOMDocument> spXMLDOM;
- HRESULT hr = spXMLDOM.CoCreateInstance(__uuidof(DOMDocument));
- if ( FAILED(hr) ) throw"不能创建XML Parser对象";
- if ( spXMLDOM.p == NULL ) throw "不能创建XML Parser对象";
- // 如果对象创建成功的话,就开始装载XML文档
- VARIANT_BOOL bSuccess = false;
- hr = spXMLDOM->load(CComVariant(L"xmldata.xml"),&bSuccess);
- if ( FAILED(hr) ) throw"不能够在解析器中装载XML文档";
- if ( !bSuccess ) throw"不能够在解析器中装载XML文档";
- // 检查并搜索"xmldata/xmlnode"
- CComBSTR bstrSS(L"xmldata/xmlnode");
- CComPtr<IXMLDOMNode> spXMLNode;
- //用接口IXMLDOMDocument的方法selectSingleNode方法定位该节点
- hr = spXMLDOM->selectSingleNode(bstrSS,&spXMLNode);
- if ( FAILED(hr) ) throw"不能在XML节点中定位'xmlnode' ";
- if ( spXMLNode.p == NULL ) throw "不能在XML节点中定位'xmlnode' ";
- //DOM对象“spXMLNode”现在包含了XML节点<xmlnode>,所以我们可以在
- //它下面创建一个子节点并把找到的该节点作为它的父节点。
- CComPtr<IXMLDOMNode> spXMLChildNode;
- //用接口IXMLDOMDocument的方法createNode方法创建一个新节点。
- hr = spXMLDOM->createNode(
- CComVariant(NODE_ELEMENT),
- CComBSTR("xmlchildnode"),
- NULL,&spXMLChildNode);
- if ( FAILED(hr) ) throw"不能创建'xmlchildnode' 节点";
- if ( spXMLChildNode.p == NULL )
- throw "不能创建'xmlchildnode' 节点";
- //添加新节点到spXMLNode节点下去。
- CComPtr<IXMLDOMNode> spInsertedNode;
- hr = spXMLNode->appendChild(spXMLChildNode,&spInsertedNode);
- if ( FAILED(hr) ) throw"不能创建'xmlchildnode' 节点";
- if ( spInsertedNode.p == NULL )throw "不能移动'xmlchildnode' 节点";
- //对新节点添加属性。
- CComQIPtr<IXMLDOMElement> spXMLChildElement;
- spXMLChildElement = spInsertedNode;
- if ( spXMLChildElement.p == NULL )
- throw "不能在XML元素接口中查询到'xmlchildnode' ";
- //设置新节点的属性
- hr = spXMLChildElement->setAttribute(CComBSTR(L"xml"),CComVariant(L"fun"));
- if ( FAILED(hr) ) throw"不能插入新的属性";
- //下面的程序段用来寻找一个节点并显示该节点的相关信息
- // 查找"xmldata/xmltext"节点
- spXMLNode = NULL; // 释放先前的节点
- bstrSS = L"xmldata/xmltext";
- hr = spXMLDOM->selectSingleNode(bstrSS,&spXMLNode);
- if ( FAILED(hr) ) throw"不能定位'xmltext'节点";
- if ( spXMLNode.p == NULL ) throw"不能定位'xmltext'节点";
- // 得到该节点包含的文本并显示它
- CComVariant varValue(VT_EMPTY);
- hr = spXMLNode->get_nodeTypedValue(&varValue);
- if ( FAILED(hr) ) throw"不能提取'xmltext'文本";
- if ( varValue.vt == VT_BSTR ) {
- // 显示结果,注意这里要把字符串从形式BSTR转化为ANSI
- USES_CONVERSION;
- LPTSTR lpstrMsg = W2T(varValue.bstrVal);
- std::cout << lpstrMsg << std::endl;
- } // if
- else {
- // 如果出现错误
- throw "不能提取'xmltext'文本";
- } // else
- //保存修改过的XML文档到指定的文档名
- hr = spXMLDOM->save(CComVariant("updatedxml.xml"));
- if ( FAILED(hr) ) throw"不能保存修改过的XML文档";
- std::cout << "处理完成..." << std::endl << std::endl;
- } // try
- catch(char* lpstrErr) {
- // 出现错误
- std::cout << lpstrErr << std::endl << std::endl;
- } // catch
- catch(...) {
- // 未知错误
- std::cout << "未知错误..." << std::endl << std::endl;
- } // catch
- // 结束对COM的使用
- CoUninitialize();
- }
题解决:
比较一下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>