Benutzer mit den meisten Antworten
XML Dateien zum Initilisieren eines Programmes nutzen

Frage
-
Hallo, ich komme eher so von der SPS-Schine her und möchte jetzt auch paar Windows Tool schreiben. Habe bei einem Kollegen gesehen, dass er seine Programme mit XML Dokumenten initialisiert. Also er weist zB. seinen verwedeten Variablen einen Pfad im OPC-Server zu. Wie verwendet man denn sowas nun und wozu ist es sinnvoll soetwas zu nutzen. Gibts da irgendwo ein gutes Beispiel, oder eine Gute Bschreibng/Dokumentation?
Danke euch
Antworten
-
Hallo B.,
also die app.config zu benutzen ist ~oft keine gute Idee, und wird immer wieder (und leicht) missverstanden.
Dennoch gibt es auch dort Lösungen, die auch Typsicherheit mit berücksichtigen: [Typsichere Anwendungs-Einstellungen in app.config schreiben].
Die typsicheren Eigenschaften über den Designer (oder eigene Klassen) werden automatisch von .NET in XML persistiert und können auch über die ebenfalls fertige Methode explizit geladen gesichert, up-gegradet etc. werden - ein paar aus der Doku kopiert:
Reload Aktualisiert die Werte der Anwendungseinstellungseigenschaft aus dem permanenten Speicher. Reset Stellt die beibehaltenen Anwendungseinstellungswerte mit den entsprechenden Standardeigenschaften wieder her. Save Speichert die aktuellen Werte der Anwendungseinstellungseigenschaften. (Überschreibt SettingsBase.Save) ToString Gibt einen String zurück, der das aktuelle Object darstellt. (Von Object geerbt.) Upgrade Aktualisiert Anwendungseinstellungen, um eine aktuellere Installation der Anwendung wiederzugeben.
.NET hatte schon immer automatisierte und vor allen Dingen typsichere Einstellungen, die aber eben nicht direkt in der app.config (etwa beim Kunden) zu ändern sind, sondern normal in einem Verzeichnis liegen, die der Anwender auch ändern darf. Sogar eigene Array-Typen sind möglich: [Typsichere Settings mit eigenen Array-Typen]
So ist zum Beispiel die spätere "App.exe.config" ja im Applikationsordner des Kunden und dort normal gar nicht beschreibbar, da keine Rechte im Programme-Verzeichnis vorhanden sind (insb. ab Vista/Windows leicht sichtbar).[Übersicht über Anwendungseinstellungen]
http://msdn.microsoft.com/de-de/library/k4s6c3a0.aspx
Zudem ist eben möglichst die Typsicherheit zu nutzen. Also möglichst (auch eigene) Klassen benutzen, da sonst leicht Fehler bei Eingaben entstehen können. Weitere Vorteile sind die mögliche Bindungan ein PropertyGrid, das durch Attribute dann den Benutzer automatisiert mit Editoren für die Eigenschaften "führt".
Das ist die fehleranfällige Eingabe in XML Dateien schon lange nicht mehr Standard.
Ich kann Dir jetzt leider nicht alles darüber erzählen - das muss man nachlesen. Ggf. auf Nachfrage noch Einzelheiten.
Aber: der überwiegende Standard ist die Nutzung der typsicheren Properties über Designer oder eigene Klassen
- also keine eigene XML Verarbeitung, sondern man lässt das bereits fertige dafür designte Klassen machen.
ciao Frank- Als Antwort vorgeschlagen Pawel Warmuth Freitag, 15. Oktober 2010 19:09
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 21. Oktober 2010 08:03
-
Hi,
es ist immer Sinnvoll sein Programm bei Datenquellen etc. extern umprogrammierbar zu machen. Es wäre unklug zB einen Connectionstring für eine DB "hart" in den Code zu schreiben.
Um das zu realisieren gibt es mehrere möglichkeiten :
Nutze die App.Config (einfach mal goggeln , gibt x hoch 30 Beispiele)
oder aber du schreibts dir ne eigene Configklasse die deine XML einliest und in Objekte Kapselt zB.
internal class CustomConfig { private XDocument doc; public string MailServer; public int MailPort; public string MailUser; public string MailPass; public List<string> MailRcpt; public List<string> MailBcc; public string MailFrom; public string MailFromName; public string Subject; public string MessageBody; public bool UseZip; public string ZipPass; public string FtpServer; public int FtpPort; public bool UsePassive; public string FtpUser; public string FtpPass; public string Folder; public string SearchPattern; public string ExportFolder; public string LogFolder; public bool DeleteFileFromFtp; public HaymarketConfig() { try { doc = XDocument.Load(AppDomain.CurrentDomain.BaseDirectory + Path.DirectorySeparatorChar + "config.xml"); MailServer = doc.Element("Configuration").Element("Mail").Attribute("Server").Value; MailPort = Convert.ToInt32(doc.Element("Configuration").Element("Mail").Attribute("Port").Value); MailUser = doc.Element("Configuration").Element("Mail").Attribute("User").Value; MailPass = doc.Element("Configuration").Element("Mail").Attribute("Pass").Value; MailRcpt = doc.Element("Configuration").Element("Mail").Elements("Rcpt").Select(p => p.Value).ToList(); MailBcc = doc.Element("Configuration").Element("Mail").Elements("Bcc").Select(p => p.Value).ToList(); MailFrom = doc.Element("Configuration").Element("Mail").Attribute("From").Value; MailFromName = doc.Element("Configuration").Element("Mail").Attribute("FromName").Value; Subject = doc.Element("Configuration").Element("Mail").Element("Subject").Value; MessageBody = doc.Element("Configuration").Element("Mail").Element("Body").Value; UseZip = doc.Element("Configuration").Element("Mail").Attribute("UseZip").Value.Contains("True"); ZipPass = doc.Element("Configuration").Element("Mail").Attribute("ZipPass").Value; FtpServer = doc.Element("Configuration").Element("FTP").Attribute("Server").Value; FtpPort = Convert.ToInt32(doc.Element("Configuration").Element("FTP").Attribute("Port").Value); UsePassive = doc.Element("Configuration").Element("FTP").Attribute("UsePassive").Value.Contains("true"); FtpUser = doc.Element("Configuration").Element("FTP").Attribute("User").Value; FtpPass = doc.Element("Configuration").Element("FTP").Attribute("Pass").Value; Folder = doc.Element("Configuration").Element("FTP").Attribute("FolderPattern").Value; SearchPattern = doc.Element("Configuration").Element("FTP").Attribute("SearchPattern").Value; ExportFolder = doc.Element("Configuration").Element("Programm").Attribute("ExportFolder").Value; LogFolder = doc.Element("Configuration").Element("Programm").Attribute("LogFolder").Value; DeleteFileFromFtp = doc.Element("Configuration").Element("Programm").Attribute("DeleteFromFtp").Value.Contains("True"); } catch (Exception ex) { throw; } }
- Als Antwort vorgeschlagen Pawel Warmuth Freitag, 15. Oktober 2010 17:58
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 21. Oktober 2010 08:03
Alle Antworten
-
Hi,
es ist immer Sinnvoll sein Programm bei Datenquellen etc. extern umprogrammierbar zu machen. Es wäre unklug zB einen Connectionstring für eine DB "hart" in den Code zu schreiben.
Um das zu realisieren gibt es mehrere möglichkeiten :
Nutze die App.Config (einfach mal goggeln , gibt x hoch 30 Beispiele)
oder aber du schreibts dir ne eigene Configklasse die deine XML einliest und in Objekte Kapselt zB.
internal class CustomConfig { private XDocument doc; public string MailServer; public int MailPort; public string MailUser; public string MailPass; public List<string> MailRcpt; public List<string> MailBcc; public string MailFrom; public string MailFromName; public string Subject; public string MessageBody; public bool UseZip; public string ZipPass; public string FtpServer; public int FtpPort; public bool UsePassive; public string FtpUser; public string FtpPass; public string Folder; public string SearchPattern; public string ExportFolder; public string LogFolder; public bool DeleteFileFromFtp; public HaymarketConfig() { try { doc = XDocument.Load(AppDomain.CurrentDomain.BaseDirectory + Path.DirectorySeparatorChar + "config.xml"); MailServer = doc.Element("Configuration").Element("Mail").Attribute("Server").Value; MailPort = Convert.ToInt32(doc.Element("Configuration").Element("Mail").Attribute("Port").Value); MailUser = doc.Element("Configuration").Element("Mail").Attribute("User").Value; MailPass = doc.Element("Configuration").Element("Mail").Attribute("Pass").Value; MailRcpt = doc.Element("Configuration").Element("Mail").Elements("Rcpt").Select(p => p.Value).ToList(); MailBcc = doc.Element("Configuration").Element("Mail").Elements("Bcc").Select(p => p.Value).ToList(); MailFrom = doc.Element("Configuration").Element("Mail").Attribute("From").Value; MailFromName = doc.Element("Configuration").Element("Mail").Attribute("FromName").Value; Subject = doc.Element("Configuration").Element("Mail").Element("Subject").Value; MessageBody = doc.Element("Configuration").Element("Mail").Element("Body").Value; UseZip = doc.Element("Configuration").Element("Mail").Attribute("UseZip").Value.Contains("True"); ZipPass = doc.Element("Configuration").Element("Mail").Attribute("ZipPass").Value; FtpServer = doc.Element("Configuration").Element("FTP").Attribute("Server").Value; FtpPort = Convert.ToInt32(doc.Element("Configuration").Element("FTP").Attribute("Port").Value); UsePassive = doc.Element("Configuration").Element("FTP").Attribute("UsePassive").Value.Contains("true"); FtpUser = doc.Element("Configuration").Element("FTP").Attribute("User").Value; FtpPass = doc.Element("Configuration").Element("FTP").Attribute("Pass").Value; Folder = doc.Element("Configuration").Element("FTP").Attribute("FolderPattern").Value; SearchPattern = doc.Element("Configuration").Element("FTP").Attribute("SearchPattern").Value; ExportFolder = doc.Element("Configuration").Element("Programm").Attribute("ExportFolder").Value; LogFolder = doc.Element("Configuration").Element("Programm").Attribute("LogFolder").Value; DeleteFileFromFtp = doc.Element("Configuration").Element("Programm").Attribute("DeleteFromFtp").Value.Contains("True"); } catch (Exception ex) { throw; } }
- Als Antwort vorgeschlagen Pawel Warmuth Freitag, 15. Oktober 2010 17:58
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 21. Oktober 2010 08:03
-
Hallo B.,
also die app.config zu benutzen ist ~oft keine gute Idee, und wird immer wieder (und leicht) missverstanden.
Dennoch gibt es auch dort Lösungen, die auch Typsicherheit mit berücksichtigen: [Typsichere Anwendungs-Einstellungen in app.config schreiben].
Die typsicheren Eigenschaften über den Designer (oder eigene Klassen) werden automatisch von .NET in XML persistiert und können auch über die ebenfalls fertige Methode explizit geladen gesichert, up-gegradet etc. werden - ein paar aus der Doku kopiert:
Reload Aktualisiert die Werte der Anwendungseinstellungseigenschaft aus dem permanenten Speicher. Reset Stellt die beibehaltenen Anwendungseinstellungswerte mit den entsprechenden Standardeigenschaften wieder her. Save Speichert die aktuellen Werte der Anwendungseinstellungseigenschaften. (Überschreibt SettingsBase.Save) ToString Gibt einen String zurück, der das aktuelle Object darstellt. (Von Object geerbt.) Upgrade Aktualisiert Anwendungseinstellungen, um eine aktuellere Installation der Anwendung wiederzugeben.
.NET hatte schon immer automatisierte und vor allen Dingen typsichere Einstellungen, die aber eben nicht direkt in der app.config (etwa beim Kunden) zu ändern sind, sondern normal in einem Verzeichnis liegen, die der Anwender auch ändern darf. Sogar eigene Array-Typen sind möglich: [Typsichere Settings mit eigenen Array-Typen]
So ist zum Beispiel die spätere "App.exe.config" ja im Applikationsordner des Kunden und dort normal gar nicht beschreibbar, da keine Rechte im Programme-Verzeichnis vorhanden sind (insb. ab Vista/Windows leicht sichtbar).[Übersicht über Anwendungseinstellungen]
http://msdn.microsoft.com/de-de/library/k4s6c3a0.aspx
Zudem ist eben möglichst die Typsicherheit zu nutzen. Also möglichst (auch eigene) Klassen benutzen, da sonst leicht Fehler bei Eingaben entstehen können. Weitere Vorteile sind die mögliche Bindungan ein PropertyGrid, das durch Attribute dann den Benutzer automatisiert mit Editoren für die Eigenschaften "führt".
Das ist die fehleranfällige Eingabe in XML Dateien schon lange nicht mehr Standard.
Ich kann Dir jetzt leider nicht alles darüber erzählen - das muss man nachlesen. Ggf. auf Nachfrage noch Einzelheiten.
Aber: der überwiegende Standard ist die Nutzung der typsicheren Properties über Designer oder eigene Klassen
- also keine eigene XML Verarbeitung, sondern man lässt das bereits fertige dafür designte Klassen machen.
ciao Frank- Als Antwort vorgeschlagen Pawel Warmuth Freitag, 15. Oktober 2010 19:09
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 21. Oktober 2010 08:03
-
hi, über die Value Eigenschaft des jeweiligen elementes/atttributes kannst du den wert setzten und das Dokument speichern
Und wie genau geht das? Also ich habe folgendes geschriebendoc.Element("activation").Element("language").Value = "Test";
aber es hat sich nichts in der Datei verändert. Muss ich noch irgendwie ein save befehl geben?
und was ist ein element und was ein attribute?
- Bearbeitet Robert BreitenhoferModerator Donnerstag, 21. Oktober 2010 08:03 Formatierung
-
Hi,
ich empfehle dringend das lesen vom Galileo Openbook Kapitel Linq to XML
http://openbook.galileocomputing.de/visual_csharp_2010/visual_csharp_2010_16_009.htm
Es fehlt dir wohl am fundementalem wissen, einfach Copy&Paste ist nicht Sinn der Sache ;-)
Grüße