c# - 如何使用 XmlAttributeOverrides 覆盖集合元素的 xml 元素名称?

标签 c# xml-serialization overriding

我有一个非常基本的对象对象模型,它正在被 System.Xml.XmlSerialization 东西序列化。我需要使用 XmlAttributeOverrides 功能来设置子元素集合的 xml 元素名称。

public class Foo{
  public List Bars {get; set; }
}

public class Bar {
  public string Widget {get; set; }
}

使用标准的 xml 序列化程序,这将作为

 <Foo>
  <Bars>
    <Bar>...</Bar>
  </Bars>
 </Foo>

我需要使用 XmlOverrideAttributes 来说明这一点

 <Foo>
  <Bars>
    <SomethingElse>...</SomethingElse>
  </Bars>
 </Foo>

但我似乎无法重命名集合中的子元素...我可以重命名集合本身...我可以重命名根...不确定我做错了什么。

这是我现在拥有的代码:

XmlAttributeOverrides xOver = new XmlAttributeOverrides();

var bars = new XmlElementAttribute("SomethingElse", typeof(Bar));
var elementNames = new XmlAttributes();
elementNames.XmlElements.Add(bars);
xOver.Add(typeof(List), "Bars", elementNames);

StringBuilder stringBuilder = new StringBuilder();
StringWriter writer = new StringWriter(stringBuilder);
XmlSerializer serializer = new XmlSerializer(typeof(Foo), xOver);
serializer.Serialize(writer, someFooInstance);

string xml = stringBuilder.ToString();

但这根本不会改变元素的名称...我做错了什么?

谢谢

最佳答案

要做到这一点,您需要 [XmlArray][XmlArrayItem](最好两者都明确):

using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;
public class Foo {
    public List<Bar> Bars { get; set; }
}  
public class Bar {
    public string Widget { get; set; }
}
static class Program {
    static void Main() {
        XmlAttributeOverrides xOver = new XmlAttributeOverrides();
        xOver.Add(typeof(Foo), "Bars", new XmlAttributes {
            XmlArray = new XmlArrayAttribute("Bars"),
            XmlArrayItems = {
                new XmlArrayItemAttribute("SomethingElse", typeof(Bar))
            }
        });
        XmlSerializer serializer = new XmlSerializer(typeof(Foo), xOver);
        using (var writer = new StringWriter()) {
            Foo foo = new Foo { Bars = new List<Bar> {
                new Bar { Widget = "widget"}
            }};
            serializer.Serialize(writer, foo);
            string xml = writer.ToString();
        }            
    }
}

关于c# - 如何使用 XmlAttributeOverrides 覆盖集合元素的 xml 元素名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2247086/

相关文章:

c# - 如何用 C# .NET 编写程序,在 Linux/Wine/Mono 上运行它们?

c# - 如何在 .Net 中序列化 COM 对象?

java - Guice 子模块阻止继承绑定(bind)

仅当调用 System.out.println 时才会调用 Java 重写方法

java - 堆栈跟踪行中引用的基类?

c# - 我的 EF 查询有什么问题?

c# - 如何确保 FirstOrDefault<KeyValuePair> 已返回值

c# - 主键与唯一键冲突异常处理

c# - 当 minOccurs 属性 > 1 时使用默认属性有什么好处?

c# - IList<object[]> XmlSerializer 与通用列表的序列化