簡體   English   中英

C#/。NET XML Serializer - 使用屬性作為元素名稱

[英]C#/.NET XML Serializer - using a property as element name

警告 - 我不是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>

我明白這可能過於神奇,並且可以想象有一個很好的理由這不應該起作用......但我認為它可能,這是一個好地方問:)

XmlSerializer(實際上,所有Framework序列化程序實際上)本地序列化類型,而不是名稱。 歸屬裝飾器允許您在名稱之前使用它,但這些是靜態運行時查找,因此它們不允許您使用該結構插入序列化過程。

相反,您要做的是編寫自己的序列化例程。 這將允許您覆蓋所需的節點命名序列 - 基本上插入Name字段的屬性作為節點名稱。 您對實現IXmlSerializable接口感興趣。 請記住,這也會影響反序列化。

您可以使用[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>

因此,您將擁有一個包含根和列表的主類以及該元素的另一個類:

[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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM