困扰多日的问题。我定义了一个xsd文件,里面有个INFO元素,包含两个子元素,一个为性别GENDER,为枚举类型;一个为字符串类型的ADDRESS。如下所示: <xs:element name="INFO">
<xs:complexType>
<xs:sequence>
<xs:element name="GENDER" default="M" nillable="true" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="M"/>
<xs:enumeration value="F"/>
<xs:enumeration value="U"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="ADDRESS" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="20"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>枚举gender子元素有个nillable属性设为true。程序要求是当GENDER未知时,xml不出现GENDER节点,即如下所示:
<INFO>
<ADDRESS>adbedde</ADDRESS>
</INFO>
但我用vs.net2005自带的xsd命令把xsd文件转化为 cs文件后,生成了INFO类,程序中把这个类对象的GENDER设为null,然后序列化该对象时,GENDER元素还会出现,如:<GENDER nil="true"/>,请问我该如何做,才能使枚举元素不出现在xml中呢?
多谢各位大侠了。
<xs:complexType>
<xs:sequence>
<xs:element name="GENDER" default="M" nillable="true" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="M"/>
<xs:enumeration value="F"/>
<xs:enumeration value="U"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="ADDRESS" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="20"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>枚举gender子元素有个nillable属性设为true。程序要求是当GENDER未知时,xml不出现GENDER节点,即如下所示:
<INFO>
<ADDRESS>adbedde</ADDRESS>
</INFO>
但我用vs.net2005自带的xsd命令把xsd文件转化为 cs文件后,生成了INFO类,程序中把这个类对象的GENDER设为null,然后序列化该对象时,GENDER元素还会出现,如:<GENDER nil="true"/>,请问我该如何做,才能使枚举元素不出现在xml中呢?
多谢各位大侠了。
4楼的方法我去试一下,回头告知大家结果。
经过我的测试,发现对于minOccurs=0的枚举类型,如果设置了默认值,xsd转换为cs代码后没有specified属性。
如果没有设置默认值,则含有specified属性。
把specified属性设为false,则可保证对应节点不出现,nillable属性不能保证节点不出现。
我不得已手工加上了specified属性,测试通过。