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>