2009-09-14 68 views
10

我一直在使用xsd.exe來生成將XML反序列化到的類。 我有不需要在源XSD十進制值:xsd.exe生成的類可爲空的值

<xs:attribute name="Balance" type="xs:decimal" use="optional" /> 

所得類從XSD生成以下代碼:

private decimal balanceField; 

[System.Xml.Serialization.XmlAttributeAttribute()] 
public decimal Balance { 
    get { 
     return this.balanceField; 
    } 
    set { 
     this.balanceField = value; 
    } 
} 

哪我注意到不可爲空。

如何,而不是生成的字段爲空的,如圖所示:

private decimal? balanceField; 

[System.Xml.Serialization.XmlAttributeAttribute()] 
public decimal? Balance { 
    get { 
     return this.balanceField; 
    } 
    set { 
     this.balanceField = value; 
    } 
} 

回答

8

目前它的工作原理應該如此。我使用的XSD v2.0.50727.42和:

<xs:element name="Port" type="xs:int" nillable="true" /> 

產生正是你一直在尋找的東西(沒有冗餘...Specified字段和屬性):

private System.Nullable<int> portField; 

[System.Xml.Serialization.XmlElementAttribute(IsNullable = true)] 
public System.Nullable<int> Port { 
    get { 
     return this.portField; 
    } 
    set { 
     this.portField = value; 
    } 
} 
+5

只適用於元素,不適用於最初問題的屬性。 – 2013-07-10 09:17:30

2

我剛剛注意到,它實際上包含下面的代碼:

private bool balanceFieldSpecified; 

[System.Xml.Serialization.XmlIgnoreAttribute()] 
public bool BalanceSpecified { 
    get { 
     return this.balanceFieldSpecified; 
    } 
    set { 
     this.balanceFieldSpecified = value; 
    } 
} 

它提供的功能我需要。

我會留下一段時間的問題,以防萬一有一個優雅的方式來使用可爲空?改爲輸入。

+6

不幸的是,XSD.EXE約爲在.NET框架中存在可空類型之前,所以他們必須想出一個可以在任何情況下都能正常工作的解決方案。我不知道有什麼辦法可以告訴xsd.exe使用可空類型,而不是.....(有人應該加強並在某天創建一個有用的替代xsd.exe!:-)) – 2009-09-14 12:06:05

+0

存在類似的kludge對於xsd.exe生成的DataSets,除了代替屬性外,該行將包含一個'IsBalanceNull()'方法。 – 2009-12-11 19:08:49

+0

@marc_s xsd2code正在嘗試提供該功能。 – 2012-12-06 09:13:16

5

我相信如果您在XML模式定義中添加nillable =「true」,則XSD將爲該元素創建一個可爲空的類型。無論如何,這可能是一個好主意,因爲你暗示這個值確實是可修改的,這將使你的模式定義在這方面更加明確。

不幸的是,在這種情況下它仍然包含相應的「指定」字段。如果您希望序列化程序直接遵循可空值,則需要從生成的代碼中手動刪除「xxSpecified」列。

相關問題