2010-01-29 69 views
3

警告 - 我不是一個XML大師。C#/ .NET XML序列化程序 - 使用屬性作爲元素名稱

以下是我有:

<Fields> 
    <Field name="BusinessName" look-up="true">My Business</Field> 
    <Field name="BusinessType" look-up="false">Nobody really knows!</Field> 
</Fields> 

這映射回:

[XmlArrayItem(ElementName = "Field")] 
public List<UserInfoField> Fields; 

[Serializable, XmlRoot("Field")] 
public class UserInfoField 
{ 
    [XmlAttributeAttribute("name")] 
    public string Name; 

    [XmlText] 
    public string Value; 

    [XmlAttributeAttribute("look-up")] 
    public bool LookUp; 
} 

反正有沒有得到這個序列化輸出,而不是:

<Fields> 
    <BusinessName look-up="true">My Business</BusinessName> 
    <BusinessType look-up="false">Nobody really knows!</BusinessType> 
</Fields> 

我明白,這可能是過於神奇,可以想像有一個很好的原因,這不應該工作......但我想它可能會,這是一個好地方,問:)

回答

3

XmlSerializer的(以及,所有框架串行器實際上)本地序列化類型,而不是名稱。屬性裝飾器讓你可以在名稱前面找到那些東西,但這些是靜態運行時查找,所以它們不允許你使用該結構插入到序列化過程中。

相反,你想要做的是編寫你自己的序列化例程。這將允許您覆蓋所需的節點命名序列 - 實質上將名稱字段的屬性插入爲節點名稱。您有興趣實施IXmlSerializable界面。請記住,這在處理反序列化方面也有後果。

+0

這是不正確的,你可以使用屬性覆蓋元素的name [XmlArrayItem] – 2013-03-20 21:30:30

+0

不能覆蓋動態使用XmlSerializer因爲是元素名稱。你可以靜態地定義它,但這種情況下需要一個基於數據值的名稱。請修改或刪除您的評論,這是不準確的。 – jro 2013-03-21 04:52:49

2

您可以同時使用[XmlArray][XmlArrayItem]和屬性,因爲它是在這裏說http://msdn.microsoft.com/en-us/library/2baksw0z(v=vs.71).aspx

[XmlArray("Fields")] 
[XmlArrayItem("Field")] 
public List<UserInfoField> Fields; 

不過,我建議你序列化arroung根級別:

<root> 
    <Fields> 
    <Field name="BusinessName" look-up="true">My Business</Field> 
    <Field name="BusinessType" look-up="false">Nobody really knows!</Field> 
    </Fields> 
</root> 

因此,您將擁有一個帶有根和列表的主類d另一個類的元素:

[Serializable, XmlRoot("Root")] 
public class Fields 
{ 

    [XmlArray("Fields")] 
    [XmlArrayItem(ElementName = "Field")] 
    public List<UserInfoField> Fields; 
} 

[Serializable, XmlRoot("Field")] 
public class UserInfoField 
{ 
    [XmlAttributeAttribute("name")] 
    public string Name; 

    [XmlText] 
    public string Value; 

    [XmlAttributeAttribute("look-up")] 
    public bool LookUp; 
} 
+1

這不會產生OP的預期串行輸出。 – jro 2013-03-21 15:20:32