2008-10-10 36 views
3

我遇到了一個有點令人沮喪的問題。在C#(.NET 3.5)中反序列化xml時,是否可以設置默認值?基本上我嘗試反序列化一些XML,是不是我的控制之下,一個元素看起來像這樣:在C#(.NET 3.5)中反序列化xml時可以設置默認值嗎?

<assignee-id type="integer">38628</assignee-id> 

它也可以是這樣的:現在

<assignee-id type="integer" nil="true"></assignee-id> 

,在我的課我有以下屬性應該接收數據:

[XmlElementAttribute("assignee-id")] 
public int AssigneeId { get; set; } 

這適用於第一個xml元素示例,但第二個失敗。我試過改變屬性類型爲int?但這並沒有幫助。我需要在某些時候將它序列化回相同的xml格式,但是我試圖使用內置的序列化支持,而不必訴諸於自己的方式。

有沒有人有這種問題的經驗?

回答

3

它看起來像你的源XML使用XSI:類型和XSI:無,但不要用名稱空間作爲前綴。

你可以做的是處理這些與XSLT把這個:

<assignees> 
    <assignee> 
    <assignee-id type="integer">123456</assignee-id> 
    </assignee> 
    <assignee> 
    <assignee-id type="integer" nil="true"></assignee-id> 
    </assignee> 
</assignees> 

到這一點:

<assignees xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <assignee> 
    <assignee-id xsi:type="integer">123456</assignee-id> 
    </assignee> 
    <assignee> 
    <assignee-id xsi:type="integer" xsi:nil="true" /> 
    </assignee> 
</assignees> 

這將被正確地處理的XmlSerializer無需任何自定義代碼。這個XSLT相當簡單,並且是一個有趣的練習。從許多「複製」XSLT樣本中的一個開始,只需添加「type」和「nil」屬性的模板即可輸出名稱空間屬性。

如果您更喜歡可以將XML文檔加載到內存中並更改屬性,但這不是一個好主意,因爲XSLT引擎針對性能進行了調整,並且可以處理相當大的文件而無需將它們完全加載到內存中。

1

XmlSerializer使用xsi:nil - 所以我期望您需要爲此執行自定義IXmlSerializable序列化。抱歉。

相關問題