XML als C# Klasse  
Frank Dzaebel, erstellt am: 27.12.06, zuletzt geändert:  02.01.07
Kategorie: Implementation, .NET-Version: 2.0, [Download]

Will man ausgehend von einer XML-Datei eine C#-Klasse benutzen/erstellen, um deren Werte ggf. einlesen oder speichern zu können, so kann man zum Beispiel die im Folgenden beschriebene Methode über den XmlSerializer anwenden. Selbst generische List<T> Typen werden dabei automatisch serialisiert. Die Modifikation der Werte kann z.B. über ein PropertyGrid vom User vorgenommen werden, indem man das Array-Objekt einfach der SelectedObject-Eigenschaft des PropertyGrid's zuweist:

Nebenbei wird gezeigt, wie man im PropertyGrid über TypeConverter und ExpandableObjectConverter eigene Klassen (-Instanzen) als Eigenschaft editierbar macht. Hier ist der dazu benötigte Code.


Weiterführende Literatur
:
-
Mit dem XmlSerializer eigene Objekte serialisieren und deserialisieren
- Aus XML mittels XSD.exe automatisch Schreib-Lese-Zugriffe generieren
- Typsichere Settings mit eigenen Array-Typen
- Optimale Nutzung des PropertyGrid-Steuerelements in .NET Framework


using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Xml.Serialization;
using System.IO;
using System.ComponentModel;

namespace SettingsExample
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

    MySettings mySettings;
    private void Form1_Load(object sender,EventArgs e)
    {
      mySettings = MySettings.Einlesen();
      MessageBox.Show(File.ReadAllText(MySettings.DateiPfad));
      propertyGrid1.SelectedObject = mySettings;

      #region per Code ändern, etwa mit:
      //mySettings.DatenListe = new List<Daten>(1);
      //Daten daten = new Daten(); daten.Id=42; daten.Value="Neu0";
      //mySettings.DatenListe.Add(daten); MySettings.Schreiben(mySettings);
      #endregion
    }

    private void btnSpeichern_Click(object sender,EventArgs e)
    {
      MySettings.Schreiben(mySettings);
    }
  }

  public class MySettings
  {
    string identifier = "LP";
    public string Identifier
    {
      get { return identifier; }
      set { identifier = value; }
    }

    long typ = 0285001451;
    [XmlElementAttribute("Type")] //wird dadurch im XML als "Type" und nicht als "Typ" serialisiert.
    
    public long Typ
    {
      get { return typ; }
      set { typ = value; }
    }

int var = 1; const int minVar = -3; const int maxVar = 218; const string varInfo = "Der Wert muss zwischen -3 und 218 liegen!"; [Description(varInfo)] public int Var { get { return var; } set // Mit Check der Bereichsgrenzen [minVar, maxVar] { if (value < minVar || value > maxVar) throw new Exception("Der Wert muss zwischen " + minVar.ToString() + " und " + maxVar.ToString() + " liegen!"); var = value; } } string charge = "RCTT21A"; public string Charge { get { return charge; } set { charge = value; } } List<Daten> datenListe; [Description("Hier können Sie neue Daten-Elemente hinzufügen")] public List<Daten> DatenListe { get { return datenListe; } set { datenListe = value; } } static public string DateiPfad = "MySettings.xml"; static public MySettings Einlesen() { try { XmlSerializer serializer = new XmlSerializer(typeof(MySettings)); TextReader tr = new StreamReader(DateiPfad); MySettings mySettings = (MySettings)serializer.Deserialize(tr); tr.Close(); return mySettings; } catch (Exception exp) { HandleException("Fehler beim Einlesen", exp); } return null; } private static void HandleException(string caption, Exception exp) { string txt=""; while (exp != null && exp.Message != null) { txt += exp.Message + "\r\n"; exp = exp.InnerException; } MessageBox.Show(txt, caption, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } static public void Schreiben(MySettings mySettings) { try { XmlSerializer serializer = new XmlSerializer(typeof(MySettings)); TextWriter tr = new StreamWriter(DateiPfad); serializer.Serialize(tr,mySettings); tr.Close(); } catch (Exception exp) { HandleException("Fehler beim Schreiben",exp); } } } public class Daten { int id = 0; [XmlAttribute()] // steht dadurch im XML nebeneinander als Attribut public int Id { get { return id; } set { id = value; } } string wert = "0000"; [XmlAttribute()] // steht dadurch im XML nebeneinander als Attribut public string Value { get { return this.wert; } set { this.wert = value; } } } }

//<?xml version="1.0" encoding="utf-8"?> //<MySettings> // <Identifier>LP</Identifier> // <Type>285001451</Type> // <OpIp IPAdresse="127.0.0.1" Port="55065"/>
// <Var>1</Var> // <Charge>RCTT21A</Charge> // <DatenListe> // <Daten Id="42" Value="Neu0" /> // <Daten Id="1" Value="Happy new 2007!" /> // </DatenListe> //</MySettings>