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

C#/.NET XML序列化程序-使用属性作为元素名,c#,.net,xml,xml-serialization,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> 是否仍要获取此序列化输出: <Fields> &l

警告——我不是xml专家

以下是我所拥有的:

<Fields>
  <Field name="BusinessName" look-up="true">My Business</Field>
  <Field name="BusinessType" look-up="false">Nobody really knows!</Field>
</Fields>
是否仍要获取此序列化输出:

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

我的生意
没人知道!
我知道这可能太神奇了,可以想象这是一个很好的理由不应该工作。。。但我认为这可能是一个很好的问题:)

XmlSerializer(实际上,所有框架序列化程序)本机序列化类型,而不是名称。属性修饰符允许您在前面使用名称,但这些是静态运行时查找,因此它们不允许您使用该结构插入序列化过程


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

您可以使用[XmlArray][XmlArrayItem]and属性,正如这里所说的

[XmlArray(“字段”)]
[XmlArrayItem(“字段”)]
公共列表字段;

但是,我建议您在根级别进行序列化:

<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;
}
[可序列化,XmlRoot(“根”)]
公共类字段
{
[XmlArray(“字段”)]
[XmlArrayItem(ElementName=“Field”)]
公共列表字段;
}
[可序列化,XmlRoot(“字段”)]
公共类用户信息字段
{
[XmlAttributeAttribute(“名称”)]
公共字符串名称;
[XmlText]
公共字符串值;
[XmlAttributeAttribute(“查找”)]
公共布尔查找;
}

这是不正确的,您可以使用属性[XmlArrayItem]覆盖元素名称。您不能按原样使用XmlSerializer动态覆盖元素名称。您可以静态地定义它,但本例需要一个基于数据值的名称。请修改或删除您的注释,这是不准确的。这不会生成OP的预期序列化输出。OP希望每个
元素根据列表中每个项目的属性值在“Field”之外有一个标记名。此方法不会生成OP要求的输出。
[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;
}