困扰多日的问题。我定义了一个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中呢?
多谢各位大侠了。

解决方案 »

  1.   

    好像是没有办法,除非你把那个元素改成Int等等。
      

  2.   

    自定义序列化 或者 利用一个xslt来转换一下序列化结果,将该节点过滤掉
      

  3.   

    xml序列化中,有一个空值指示的attribute,你自动生成的class里面,应该有GENDERSpecified这个属性,靠这个就可以指示是否生成这个节点,如果没有这个属性,你去掉nillable再试试看,如果无法生成,手工修改class也可以的。
      

  4.   

    楼上,他这个序列化是由条件滴:要求是当GENDER未知时,xml不出现GENDER节点
      

  5.   

    谢谢大家,枚举类型的元素在序列化时必须出现吗?现在我只想使序列化后的xml不出现gender节点,条件可暂时不予考虑,有办法吗?
    4楼的方法我去试一下,回头告知大家结果。
      

  6.   

    首先谢谢大家。
    经过我的测试,发现对于minOccurs=0的枚举类型,如果设置了默认值,xsd转换为cs代码后没有specified属性。
    如果没有设置默认值,则含有specified属性。
    把specified属性设为false,则可保证对应节点不出现,nillable属性不能保证节点不出现。
    我不得已手工加上了specified属性,测试通过。