Soap - Element没有xsi:nil作为属性,但反序列化不会使对象不为null

时间:2010-09-28 16:48:33

标签: c# xml soap xml-serialization xml-nil

在XML和SOAP消息方面,我是一个完全的菜鸟。 ......这是SOAP消息。

<?xml version="1.0" encoding="utf-8" ?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <CR>
            <Username xmlns="<Hidden>">mtas</Username>
            <Password xmlns="<Hidden>">password</Password>
            <id xmlns="<Hidden>">
                70dad12b-bb50-402d-8b34-
                fe2d4c0c283d
            </id>
            <Data xmlns="<Hidden>">
                <Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                xmlns="<Hidden>">
                    <CS>
                        <CSCallbackRequest xmlns="">
                            <CDS xsi:nil="true" xmlns="<Hidden>"/>
                            <CDRP xmlns="<Hidden>"/>
                            <UDI xsi:nil="true"
                            xmlns="<Hidden>"/>
                        </CSCallbackRequest>
                    </CS>
                    <Fault xsi:nil="true" />
                    <Comment xsi:nil="true"/>
                </Data>
            </Data>
        </CR>
    </s:Body>
</s:Envelope>

我们使用xsd.exe工具生成了类,这些工具为我们提供了反序列化的类。此.xsd文件由我们收到来自。

的SOAP消息的公司提供

这是问题所在。当我们从公司获得这种类型的响应时,我们正在CSCallbackRequest中寻找内部的三个元素,即CDS,CDRP和UDI。我们正在尝试确定我们正在接收哪种类型的回调。我最初的假设是当我们使用带有类型的XMLSerializer( Generated Class Type )时,CSCallbackRequest中没有xsi:nil = true的元素将允许 Generated Class Type中的对象对象不会为null。但事实并非如此。如何在反序列化后检查具有xsi:nil proprerty属性的属性?

1 个答案:

答案 0 :(得分:0)

实际上,我想出了这个问题。我在这里放的SOAP消息实际上是公司文档中的一个例子。我试图用它来模拟我们会收到的消息。在比较了来自XSD的生成的类文件之后,我注意到<CS>实际上没有在文件中定义。当它反序列化时,它不会找到该元素,因此不会填充任何内容,因为我们开始从<Data>元素开始反序列化。我检查了文档中的其他示例,但没有这个额外的<CS>元素。删除该元素修复了整个问题。我已经通知公司他们在文档中的错误。