我們使用屬性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;' –