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对象中缺少信封标记

我能想到至少两种不同的解决方案来解决您的问题,这似乎是由于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>

所以对于可能的解决方案

  1. 确保CteWebService.xml串行化,以便将OCTE结构作为其根元素。

  2. 使用等XPath来定位OCTE元素,然后取消对其的序列化。

    var nsmgr = ...
    var element = document.SelectSingleNode("//OCTE", nsmgr);
    

如果OCTE元素属于指定的Xml命名空间,则只需要初始化Xml命名空间管理器,否则可以忽略它。