我怎样才能通过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用。