【问题标题】:How to override xml element name for collection elements using XmlAttributeOverrides?如何使用 XmlAttributeOverrides 覆盖集合元素的 xml 元素名称?
【发布时间】:2010-02-11 19:23:24
【问题描述】:

我有一个非常基本的对象模型,它正在由 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();

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

谢谢

【问题讨论】:

  • 一位同事指出了 XmlArrayItemAttribute,但我似乎仍然无法让它工作 var asset = new XmlArrayItemAttribute("Asset", typeof(AssetForDelivery)); var elementNames = new XmlAttributes(); elementNames.XmlArrayItems.Add(asset); xOver.Add(typeof(AssetForDelivery), elementNames);
  • 为什么要指定 XmlOverrides?没有它们,做你想做的事很简单(看看下面@Derrik 的分析器)

标签: c# xml-serialization overriding


【解决方案1】:

德里克,

这对我有用 - 不确定它是否适合您:

public class Foo
{
    [XmlArrayItem(ElementName = "SomethingElse")]
    public List<Bar> Bars { get; set; }
}

【讨论】:

    【解决方案2】:

    要做到这一点,您需要 [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();
            }            
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-11
      • 1970-01-01
      相关资源
      最近更新 更多