Angenommen, ich habe eine XML-serialisierbare Klasse namens Song :
[Serializable]
class Song
{
public string Artist;
public string SongTitle;
}
Um Platz zu sparen (und auch die XML-Datei halb zu verschleiern ), entscheide ich mich, die XML-Elemente umzubenennen:
[XmlRoot("g")]
class Song
{
[XmlElement("a")]
public string Artist;
[XmlElement("s")]
public string SongTitle;
}
Dadurch wird eine XML-Ausgabe wie folgt erzeugt:
<Song>
<a>Britney Spears</a>
<s>I Did It Again</s>
</Song>
Ich möchte auch den Namen der Klasse / des Objekts umbenennen / neu zuordnen. Angenommen, im obigen Beispiel möchte ich die Klasse Song in g umbenennen . Damit die resultierende XML folgendermaßen aussehen sollte:
<g>
<a>Britney Spears</a>
<s>I Did It Again</s>
</g>
Ist es möglich, Klassennamen über XML-Attribute umzubenennen ?
Ich möchte das DOM nicht manuell erstellen / durchlaufen, daher habe ich mich gefragt, ob dies über einen Dekorateur erreicht werden kann.
Danke im Voraus!
UPDATE: Ups! Diesmal habe ich es wirklich wieder getan! Ich habe vergessen zu erwähnen - ich serialisiere tatsächlich eine Liste von Song-Objekten im XML.
Hier ist der Serialisierungscode:
public static bool SaveSongs(List<Song> songs)
{
XmlSerializer serializer = new XmlSerializer(typeof(List<Song>));
using (TextWriter textWriter = new StreamWriter("filename"))
{
serializer.Serialize(textWriter, songs);
}
}
Und hier ist die XML-Ausgabe:
<?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>
Anscheinend benennt das XmlRoot () -Attribut das Objekt in einem Listenkontext nicht um.
Vermisse ich etwas
quelle
[Serializable]
spielt für die XML-Serialisierung keine Rolle.XmlTypeAttribute
und seineTypeName
Eigenschaft ist der richtige Weg, dies zu tun (siehe unten).XmlRoot
. Das OP ist seit 2 Jahren nicht mehr hier, daher wird es weiterhin überall Codierer irreführen :)Antworten:
Überprüfen Sie das XmlRoot-Attribut.
Die Dokumentation finden Sie hier: 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
UPDATE: Gerade ausprobiert und es funktioniert perfekt auf VS 2008. Dieser Code:
[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; } }
Ausgänge:
<?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>
quelle
<sgr><sgs><g a="A1" s="S1" /><g a="A2" s="S2"><sgs><sgr>
XmlArrayItem("g")
ist das, wonach ich gesucht habeLösung: Verwenden Sie [XmlType (TypeName = "g")]
XmlRoot funktioniert nur mit XML - Root - Knoten gemäß der Dokumentation (und was man erwarten würde, da sein Name beinhaltet root )!
Ich konnte keine der anderen Antworten auf die Arbeit bekommen, also grub ich weiter ...
Stattdessen stellte ich fest, dass das XmlTypeAttribute (dh
[XmlType]
) und seine TypeName- Eigenschaft einen ähnlichen Job für Nicht-Root- Klassen / Objekte ausführen .z.B
[XmlType(TypeName="g")] class Song { public string Artist; public string SongTitle; }
Angenommen, Sie wenden es auf die anderen Klassen an, z.
[XmlType(TypeName="a")] class Artist { ..... } [XmlType(TypeName="s")] class SongTitle { ..... }
Dadurch wird genau das ausgegeben , was in der Frage erforderlich ist :
<g> <a>Britney Spears</a> <s>I Did It Again</s> </g>
Ich habe dies in mehreren Produktionsprojekten verwendet und keine Probleme damit festgestellt.
quelle
XmlType
hier beschriebenen. Bitte stellen Sie eine neue Frage, wenn Sie eine haben :)Wenn dies das Stammelement des Dokuments ist, können Sie [XmlRoot ("g")] verwenden .
Hier ist meine aktualisierte Antwort basierend auf Ihrer Klarstellung. Der Grad der Kontrolle, den Sie verlangen, ist ohne eine Wrapping-Klasse nicht möglich. In diesem Beispiel wird
SongGroup
die Liste mit einer Klasse umbrochen, sodass Sie den darin enthaltenen Elementen alternative Namen geben können.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()); } } } }
Dies hat den Nebeneffekt, dass ein weiteres inneres Element erzeugt wird, das die Liste selbst darstellt. Auf meinem System sieht die Ausgabe folgendermaßen aus:
<?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>
quelle
XmlType(TypeName="g")]
. Sie benötigen keine Wrapping-Klasse und können die Klassen einfach selbst zuordnen. Prost.Verwenden Sie 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; }
sollte arbeiten.
quelle
[XmlRoot("g")] class Song { }
Sollte den Trick machen
quelle