2010-02-11 86 views
3

我有一個非常基本的對象模型,它被System.Xml.XmlSerialization的東西序列化。我需要使用XmlAttributeOverrides功能爲一組子元素設置xml元素名稱。如何使用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(); 

但這並不改變元素在所有的名字......我究竟做錯了什麼?

感謝

+0

一位同事指出XmlArrayItemAttribute,但我仍然似乎無法得到它的工作 \t \t \t var asset = new XmlArrayItemAttribute(「Asset」,typeof(AssetForDelivery)); \t \t \t var elementNames = new XmlAttributes(); \t \t \t elementNames.XmlArrayItems.Add(asset); \t \t \t xOver.Add(typeof(AssetForDelivery),elementNames); –

+0

你爲什麼指定XmlOverrides?沒有它們就可以很簡單地做你想要的東西(在@ Derrik's anser的屏幕上) –

回答

8

要做到這一點,你要[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(); 
     }    
    } 
} 
2

德里克,

這爲我工作 - 不知道這對你還是不是一個合適的解決辦法:

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

雖然有效,但問題是:使用'XmlAttributeOverrides' ... –