如何检查XML中跳过的WCF数据元素?

时间:2014-10-30 14:44:39

标签: wcf xsd

在我的WCF中,我将对象“Product”定义如下:

<xs:complexType name="Product">
    <xs:sequence>
        <xs:element name="Name" type="xs:string"/>
        <xs:element name="Postcode" type="xs:string" nillable="true" minOccurs="0"/>
        <xs:element name="ProductID" type="xs:string" />
    </xs:sequence>
</xs:complexType>

请注意元素“Postcode”是nillable =“true”minOccurs =“0”,这意味着当客户端应用程序调用Web服务时,它们可以为此元素提供空值,如下所示:

<Product>
    <Name>Product 1</Name>
    <Postcode></Postcode>
    <ProductID>10</ProductID>
</Product>

或者他们可以简单地跳过“邮政编码”元素,这样传入的邮件就变成了这个(邮政编码不存在)

<Product>
    <Name>Product 1</Name>
    <ProductID>10</ProductID>
</Product>

我的问题是,在我的主机程序中,如何检查传入的XML消息中是否存在元素“Postcode”?我问,因为如果它不存在,我调用该方法获取Postcode值,那么程序将抛出一个错误:

string postcode = product.Postcode - 此调用会抛出错误吗?

非常感谢你们的任何想法/建议。

查尔斯

1 个答案:

答案 0 :(得分:0)

在断言中,你的定义中使用nillable允许你列出的两个案例是不正确的。

实际上,nillable xsd属性允许构造:

<Postcode xsi:nil='true'/>
来自Postcode的semantically different是空的,或根本不存在。

回答你的问题,

  

如何检查传入XML中是否存在元素“Postcode”   消息

我不太明白你为什么要用minOccurs = 0来定义Postcode。当wcf通过线路接收此类型时,它将尝试反序列化为预定义的C#类型。在C#中,类型具有属性或者没有属性。

例如

public class Product
{
    public string Postcode { get; set; }
}

不一样
public class Product
{
}

因此,通过允许调用者构建您的Product类型的两个不同版本,您实际上被迫定义两个单独的C#类型以反序列化,这意味着您需要两次公开您的服务操作,一次对于想要使用的调用者带有邮政编码的产品,以及一个不想使用产品的人。

我建议你重新定义你的产品类型以包含Postcode元素 - 毕竟因为它是一个字符串,你的调用者如果不想使用它就可以将它保留为null。