C#/。NET XML Serializer - 使用属性作为元素名称

时间:2010-01-29 22:44:47

标签: c# .net xml xml-serialization

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

我知道这可能过于神奇,并且可以想象有一个很好的理由这不应该起作用......但我认为它可能,这是一个值得问的好地方:)

2 个答案:

答案 0 :(得分:3)

XmlSerializer(实际上,所有Framework序列化程序实际上)本地序列化类型,而不是名称。归属装饰器允许您在名称之前使用它,但这些是静态运行时查找,因此它们不允许您使用该结构插入序列化过程。

相反,您要做的是编写自己的序列化例程。这将允许您覆盖所需的节点命名序列 - 基本上插入Name字段的属性作为节点名称。您对实现IXmlSerializable接口感兴趣。请记住,这也会影响反序列化。

答案 1 :(得分:1)

你可以同时使用 [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;
}