我们使用属性nilReason来表示XML元素为空的原因。示例:C#中带有属性的nillable元素的XML序列化#
<dateOfDeath nilReason="noValue" xsi:nil="true"/>
<dateOfDeath nilReason="valueUnknown" xsi:nil="true"/>
在第一个示例中,由于没有死亡日期,所以此人仍然活着。在第二个例子中,我们不知道死亡日期是什么。
该元素的XSD的定义在下面给出:
<xs:element name="dateOfDeath" type="DateOfDeath" nillable="true"/>
<xs:complexType name="DateOfDeath">
<xs:simpleContent>
<xs:extension base="xs:date">
<xs:attribute name="nilReason" type="NilReason"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:simpleType name="NilReason">
<xs:restriction base="xs:string">
<xs:enumeration value="noValue"/>
<xs:enumeration value="valueUnknown"/>
</xs:restriction>
</xs:simpleType>
我遇到问题,当我生成与由.NET Framework提供的xsd.exe工具C#类。如何编写生成以下XML的代码?
<dateOfDeath nilReason="noValue" xsi:nil="true"/>
这是我能写的最好的逼近代码:
DateOfDeath dateOfDeath = new DateOfDeath();
dateOfDeath.nilReason = NilReason.noValue;
dateOfDeath.nilReasonSpecified = true;
XmlSerializer serializer = new XmlSerializer(typeof(DateOfDeath));
StreamWriter writer = new StreamWriter("dateofdeath.xml");
serializer.Serialize(writer, dateOfDeath);
writer.Close();
然而,可悲的是,这个代码产生以下结果:
<dateOfDeath nilReason="noValue">0001-01-01</dateOfDeath>
这不正是我想要,因为它会生成一个虚拟的日期值。看来这是序列化程序的一个缺点。解决这个问题的唯一方法似乎是应用一个函数来删除虚拟值,并在序列化之后插入xsi:nil =“true”属性。然后还需要一个函数在反序列化之前删除xsi:nil =“true”属性。否则,在反序列化过程中,nilReason属性的信息将被丢弃。
当然,'dateOfDeath =新DateOfDeath()' - 我吨不是空的。 –
@AlexanderPetrov:的确,对象的dateOfDeath不为null,因为我必须设置属性如'dateOfDeath.noValue =“noValue”',它对应于XML属性“noValue”。但是我无法设置属性'dateOfDeath.Value = null',它对应于元素本身的空白内容。此问题是由生成的DateTime数据类型不可空行为造成的。我试图通过用DateTime替换DateTime的所有出现来解决此问题?在生成的代码中。但是,然后串行器产生一个错误。 –
在一种情况下,您将收到'xsi:nil =“true”''DateOfDeath dateOfDeath = null;' –