xml对象中缺少Envelop标记

时间:2013-12-09 13:49:32

标签: c# .net xml web-services xml-deserialization

我有一个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课程中加入此标记,还是需要在客户端中执行其他操作?

1 个答案:

答案 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>

所以可能的解决方案

  1. 确保CteWebService.xml被序列化为具有OCTE结构作为其根元素。

  2. 使用XPath来定位OCTE元素,并反而将其反序列化。

    var nsmgr = ...
    var element = document.SelectSingleNode("//OCTE", nsmgr);
    
  3. 如果OCTE元素属于指定的xml命名空间,则只需要初始化Xml NamespaceManager,否则可以将其保留。