我有一个Web应用程序,用户可以上传特定的XML文件,然后我需要将XML文件转换为Web服务中期望的对象。
代码:
var document = new XmlDocument();
document.Load(@"C:\Desktop\CteWebservice.xml");
var serializer =new XmlSerializer(typeof(OCTE));
var octe = (OCTE)serializer.Deserialize(new StringReader(document.OuterXml));
var serviceClient = new WSServiceClient();
serviceClient.InsertOCTE(octe);
当我尝试将deserialize
xml文档作为OCTE
对象时出现此错误:
<信封xmlns ='http://schemas.xmlsoap.org/soap/envelope/'>没想到。
很明显,OCTE
类没有Envelope属性。
我的问题是,我需要在OCTE
课程中加入此标记,还是需要在客户端中执行其他操作?
答案 0 :(得分:0)
我可以考虑至少两种不同的问题解决方案,这似乎是由于XML文件包含完整的SOAP请求,其中包含SOAP Envelope,SOAP Body元素和可能的SOAP标头。元件。
SOAP body元素的结构依赖于SOAP Binding样式,很可能是Document Literal Wrapped - 有关详细信息,请查看http://www.ibm.com/developerworks/webservices/library/ws-usagewsdl/index.html?ca=dat-
这意味着您正在寻找的OCTE结构可能嵌入在一个请求元素中,类似于(文档文字包装的SOAP绑定样式)
<soap:envelope>
</soap:header>
<soap:body>
<insertOCTERequest>
<OCTE>
...
</OCTE>
</insertOCTERequest>
</soap:body>
</soap:envelope>
所以可能的解决方案
确保CteWebService.xml被序列化为具有OCTE结构作为其根元素。
使用XPath来定位OCTE元素,并反而将其反序列化。
var nsmgr = ...
var element = document.SelectSingleNode("//OCTE", nsmgr);
如果OCTE元素属于指定的xml命名空间,则只需要初始化Xml NamespaceManager,否则可以将其保留。