我怎样才能通过Xml属性重命名类名?

假设我有一个名为Song的XML序列化类:

[Serializable] class Song { public string Artist; public string SongTitle; } 

为了节省空间(也半混淆 XML文件),我决定重命名XML元素:

 [XmlRoot("g")] class Song { [XmlElement("a")] public string Artist; [XmlElement("s")] public string SongTitle; } 

这将产生这样的XML输出:

 <Song> <a>Britney Spears</a> <s>I Did It Again</s> </Song> 

我想重命名/重新映射类/对象的名称。 比如说,在上面的例子中,我希望将类歌曲重命名为g 。 所以得到的XML应该看起来像这样:

 <g> <a>Britney Spears</a> <s>I Did It Again</s> </g> 

是否有可能通过xml-attributes重命名类名?

我不想手动创build/遍历DOM,所以我想知道是否可以通过装饰器来实现。

提前致谢!

更新:哎呀! 这一次我真的做到了! 忘了提及 – 我实际上是在XML中序列化Song对象的列表。

这里是序列化代码:

  public static bool SaveSongs(List<Song> songs) { XmlSerializer serializer = new XmlSerializer(typeof(List<Song>)); using (TextWriter textWriter = new StreamWriter("filename")) { serializer.Serialize(textWriter, songs); } } 

这里是XML输出:

 <?xml version="1.0" encoding="utf-8"?> <ArrayOfSong> <Song> <a>Britney Spears</a> <s>Oops! I Did It Again</s> </Song> <Song> <a>Rihanna</a> <s>A Girl Like Me</s> </Song> </ArrayOfSong> 

显然, XmlRoot()属性不会重命名列表上下文中的对象。

我错过了什么吗?

检出XmlRoot属性。

文档可以在这里find: http : //msdn.microsoft.com/en-us/library/system.xml.serialization.xmlrootattribute(v=VS.90).aspx

 [XmlRoot(Namespace = "www.contoso.com", ElementName = "MyGroupName", DataType = "string", IsNullable=true)] public class Group 

更新:刚试过,它在VS 2008完美的作品。这个代码:

 [XmlRoot(ElementName = "sgr")] public class SongGroup { public SongGroup() { this.Songs = new List<Song>(); } [XmlElement(ElementName = "sgs")] public List<Song> Songs { get; set; } } [XmlRoot(ElementName = "g")] public class Song { [XmlElement("a")] public string Artist { get; set; } [XmlElement("s")] public string SongTitle { get; set; } } 

输出:

 <?xml version="1.0" encoding="utf-8"?> <sgr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www .w3.org/2001/XMLSchema"> <sgs> <a>A1</a> <s>S1</s> </sgs> <sgs> <a>A2</a> <s>S2</s> </sgs> </sgr> 

解决scheme:使用[XmlType(TypeName =“g”)]

XmlRoot只能根据文档使用XML 根节点 (以及你期望的,因为它的名字包含root )!

我无法得到任何其他的答案工作,所以不断挖掘…

相反,我发现XmlTypeAttribute (即[XmlType] )及其TypeName属性为非根类/对象做类似的工作。

例如

 [XmlType(TypeName="g")] class Song { public string Artist; public string SongTitle; } 

假设你将它应用于其他类,例如:

 [XmlType(TypeName="a")] class Artist { ..... } [XmlType(TypeName="s")] class SongTitle { ..... } 

这将完全按照问题中的要求输出以下内容:

 <g> <a>Britney Spears</a> <s>I Did It Again</s> </g> 

我已经在几个生产项目中使用过,没有发现问题。

如果这是文档的根元素,则可以使用[XmlRoot(“g”)] 。


这是我根据你的澄清更新的回应。 没有包装课程,你所要求的控制程度是不可能的。 此示例使用SongGroup类来包装列表,以便可以为其中的项目指定备用名称。

 using System; using System.Collections.Generic; using System.IO; using System.Xml.Serialization; public class SongGroup { public SongGroup() { this.Songs = new List<Song>(); } [XmlArrayItem("g", typeof(Song))] public List<Song> Songs { get; set; } } public class Song { public Song() { } [XmlElement("a")] public string Artist { get; set; } [XmlElement("s")] public string SongTitle { get; set; } } internal class Test { private static void Main() { XmlSerializer serializer = new XmlSerializer(typeof(SongGroup)); SongGroup group = new SongGroup(); group.Songs.Add(new Song() { Artist = "A1", SongTitle = "S1" }); group.Songs.Add(new Song() { Artist = "A2", SongTitle = "S2" }); using (Stream stream = new MemoryStream()) using (StreamWriter writer = new StreamWriter(stream)) { serializer.Serialize(writer, group); stream.Seek(0, SeekOrigin.Begin); using (StreamReader reader = new StreamReader(stream)) { Console.WriteLine(reader.ReadToEnd()); } } } } 

这具有产生一个代表列表本身的内部元素的副作用。 在我的系统上,输出如下所示:

 <?xml version="1.0" encoding="utf-8"?> <SongGroup xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Songs> <g> <a>A1</a> <s>S1</s> </g> <g> <a>A2</a> <s>S2</s> </g> </Songs> </SongGroup> 
 [XmlRoot("g")] class Song { } 

应该做的伎俩

使用XmlElementAttribute: http : //msdn.microsoft.com/en-us/library/system.xml.serialization.xmlrootattribute.aspx

 [Serializable] [XmlRoot(ElementName="g")] class Song { public string Artist; public string SongTitle; } 

应该pipe用。