Как переопределить имя элемента XML для элементов коллекции с помощью XmlAttributeOverrides? - PullRequest
3 голосов
/ 11 февраля 2010

У меня есть очень базовая объектная модель объекта, которая сериализуется с помощью 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>

но я не могу заставить его переименовать дочерние элементы в коллекции ... я могу переименовать саму коллекцию ... я могу переименовать корень ... не уверен, что делаю неправильно. 1010 *

вот код, который у меня сейчас есть:

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();

но это никак не меняет название элемента ... что я делаю не так?

спасибо

Ответы [ 2 ]

8 голосов
/ 11 февраля 2010

Чтобы сделать это, вы хотите, чтобы [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();
        }            
    }
}
1 голос
/ 11 февраля 2010

Дерик,

Это сработало для меня - не уверен, подходит ли вам ответ или нет:

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