xml对象中缺少信封标记
本文关键字:对象 xml | 更新日期: 2024-08-10 01:06:27
我有一个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);
当我尝试将xml文档deserialize
作为OCTE
对象时,会出现此错误:
<信封xmlns='http://schemas.xmlsoap.org/soap/envelope/">不是预期的。
很明显,OCTE
类没有Envelope属性。
我的问题是,我需要在OCTE
类中包含这个标签,还是需要在客户端中做其他事情?
我能想到至少两种不同的解决方案来解决您的问题,这似乎是由于XML文件包含完整的SOAP请求,该请求将包含SOAP信封、SOAP正文元素和可能的SOAP标头元素。
SOAP主体元素的结构取决于SOAP绑定样式,该样式很可能是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命名空间管理器,否则可以忽略它。