C#/.NET XML序列化器 - 使用属性作为元素名称

3

警告--我不是一个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个回答

3
XmlSerializer(实际上,所有 Framework 序列化器)本地序列化类型而不是名称。属性装饰器允许您在名称方面进行一些调整,但这些都是静态运行时查找,因此不能使用该结构介入序列化过程。相反,您需要编写自己的序列化程序。这将允许您覆盖所需的节点命名顺序 - 实际上是将 Name 字段的属性作为节点名称插入进去。您需要实现 IXmlSerializable 接口。请记住,这对处理反序列化也有影响。

这不是正确的,你确实可以使用属性[XmlArrayItem]覆盖元素名称。 - Gustavo Cardoso
您不能使用XmlSerializer动态覆盖元素名称。您可以静态定义它,但是这种情况需要基于数据值的名称。请修改或删除您的评论,因为它是不准确的。 - jro

0

你可以同时使用[XmlArray][XmlArrayItem]属性,就像这里所说的一样http://msdn.microsoft.com/en-us/library/2baksw0z(v=vs.71).aspx

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

不过,我建议您在根级别周围进行序列化:

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

2
这不会产生原作者预期的序列化输出。 - jro
1
OP 想让每个 <Field> 元素都有一个标签名称,而不是基于列表中每个项目的属性值来命名为 "Field"。这种方法不能产生 OP 所要求的输出。 - p0lar_bear

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接