首页 > 解决方案 > 与 nillable 属性相关的 XML 序列化变化

问题描述

我想知道是否有人知道点网库中的一些变化,这会导致对 nillable 元素进行不同的序列化方式。三个月前,我们的系统正在生成这种元素,以防相关属性为空:

<LatinFirstName />

此元素的 XSD 如下所示:

            <xsd:element name="LatinFirstName" minOccurs="0"
                nillable="true">
                <xsd:simpleType>
                    <xsd:restriction base="xsd:string">
                        <xsd:maxLength value="70"></xsd:maxLength>
                        <xsd:pattern
                            value="[&quot;\\/\(\)\-'\.,_:a-zA-Z]+">
                        </xsd:pattern>
                    </xsd:restriction>
                </xsd:simpleType>
            </xsd:element>

然而,有些事情发生了变化,系统目前正在同一个地方产生这个:

<LatinFirstName p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance"/>

我试图找出导致这种变化的原因以及如何解决它的潜在方法。

标签: .netxmlxsdxml-serialization

解决方案


我假设这发生在您重建代码之后,行为不会随着 .net 更新而改变。所以问题是导致这种情况的构建之间发生了什么变化。

但是查看您的 xml 架构定义,“新”输出的格式正确。在针对架构进行验证时,“旧”输出将无效。

当您序列化一个对象时,序列化程序会检查属性是否已初始化。如果该属性不是并且仍然具有空值,则默认情况下将跳过它。这通过了验证,因为 minoccurs = 0;

如果该属性是用“”或空格初始化的,则序列化程序将序列化该属性,您将获得一个空标签(如果您定义了保留空格,则为空格)。这仍然是有效的 xml,但您的 xsd 中的限制不允许空元素。如果元素存在,则它必须遵守限制。通过在 xsd 中添加 nillable=true,您可以再次使其有效。序列化程序看到属性已初始化,但属性的内容为空,如果属性是用“[XmlElement(IsNullable=true)]”定义的,它会将 nillable=true 添加到 xml 消息中。


推荐阅读