XML-Serialisierung steuern



  • Guten Abend,

    ich habe das Problem, dass ich eine eigene Klasse per XMLSerialiser in XML umwandeln möchte.

    Meine Klasse ist folgendermaßen aufgebaut:

    [XmlRoot("Idee")]
        public class Idee {
            [XmlElement("ID")] 
            private String id;
            [XmlElement("Name")]
            private String name;
            [XmlElement("Autor")]
            private String autor;
            [XmlElement("Beschreibung")]
            private String beschreibung;
            [XmlElement("Timestamp")]
            private String timestamp;
            [XmlArray("Dateien")]
            [XmlArrayItem("Datei")]
            private List<Datei> dateien;
    
            public Idee() {
                id = "";
                name = "";
                beschreibung = "";
                autor = "";
                timestamp = "";
                dateien = new List<Datei>();
            }
    
            public String ID { get { return id; } set { id = value; } }
            public String Name { get { return name; } set { name = value; } }
            public String Autor { get { return autor; } set { autor = value; } }
            public String Beschreibung { get { return beschreibung; } set { beschreibung = value; } }
            public String Timestamp { get { return timestamp; } set { timestamp = value; } }
            public List<Datei> Dateien { get { return dateien; } set { dateien = value; } }
        }
    

    Das generierte XML ist folgendes:

    <Idee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <ID>10</ID>
      <Name>Fettfreie HotDogs</Name>
      <Autor>TannisJoe</Autor>
      <Beschreibung>...</Beschreibung>
      <Timestamp>08.10.2012 20:22:32</Timestamp>
      <Dateien>
      <Datei>
          <Daten />
      </Datei>
      <Datei>
          <Daten />
      </Datei>
      </Dateien>
    </Idee>
    

    Kann mir jemand sagen, wie ich die Klasse umbauen muss, damit der Tag "Dateien" das Attribut "Complex=true" erhält?

    Oder wie man generell frei Attribute vergeben kann?

    Ich wäre für jede Hilfe dankbar 🙂

    MfG TannisJoe



  • schau doch mal nach XAttribute, XElement, XDocument



  • Ich würde spontan sagen, das kannst du nicht so genau steuern, aber ich hab mich noch nie intensiv damit befasst. Schau dir mal die Attribute hier an:

    http://msdn.microsoft.com/de-de/library/83y7df3e%28v=vs.80%29.aspx



  • Den Artikel hatte ich mir schonmal durchgelesen, nur leider ist das entsprechende nicht dabei.

    Irgendwie muss das doch gehen 😞



  • TannisJoe schrieb:

    Irgendwie muss das doch gehen 😞

    Nicht unbedingt. Der Sinn ist ja, dass du durch die Serialisierung die Daten "irgendwie" gespeichert bekommst, ohne dich darum zu kümmern. Die Implementierungsdetails sollen explizit nicht interessieren. Es geht nicht darum, genau zu steuern, was dabei rauskommt. Das wäre eher die Aufgabe von einem Data Mapping Framework, wobei die meist auf eine Datenbank abzielen. Vielleicht können die auch mit XML umgehen, da hab ich auch keine Erfahrung, vielleicht findest du was.



  • Wenn du nicht darauf bestehst dass dateien unbedingt eine List<Datei> ist, dann geht es auf jeden Fall irgendwie (wie genau müsste ich selbst nachsehen). Und das "Complex" wirst du vermutlich als bool Member irgendwo anlegen müssen, denn soweit ich weiss können die .NET Serializer keine XML-Elemente oder -Attribute "aus dem Nichts heraus" erzeugen.

    Du kannst auch immer den Weg rückwärts gehen: Schreib ein XML Schema, und verwende xsd.exe ( XmlSerializer ) oder svcutil.exe ( DataContractSerializer ) um dir C# Klassen mit den nötigen XML Attributen generieren zu lassen, so dass du damit XML Files die dieses Schema verwenden laden und speichern kannst.

    Mit ein wenig manuellem Editieren kann man es sogar so einrichten, dass das XSD File als Source-File im Visual-Studio Projekt eingebunden ist, und bei jedem Build automatisch das .cs File mit den C# Klassen erstellt wird (sofern sich das XSD File geändert hat).
    Die erzeugten .cs Files definieren alle Klassen als partial , d.h. du kannst den Klassen trotzdem in einem eigenen File weitere Methoden/Properties spendieren.

    Alternativ kannst du auch http://xsd2code.codeplex.com/ verwenden - das hat ein paar Optionen mehr, und generiert etwas "schlaueren" Code (z.B. feuert es keine Property-Changed Events, wenn der geschriebene Wert gleich dem vorigen Wert war).



  • Danke an euch 🙂
    Ich glaub das mit dem XSD probier ich mal aus 🙂


Log in to reply