none
XML Dateien zum Initilisieren eines Programmes nutzen RRS feed

  • 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

    Freitag, 15. Oktober 2010 13:19

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:

    Öffentliche Methode Reload Aktualisiert die Werte der Anwendungseinstellungseigenschaft aus dem permanenten Speicher.
    Öffentliche Methode Reset Stellt die beibehaltenen Anwendungseinstellungswerte mit den entsprechenden Standardeigenschaften wieder her.
    Öffentliche Methode Save Speichert die aktuellen Werte der Anwendungseinstellungseigenschaften. (Überschreibt SettingsBase.Save)
    Öffentliche Methode ToString Gibt einen String zurück, der das aktuelle Object darstellt. (Von Object geerbt.)
    Öffentliche Methode 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
    Freitag, 15. Oktober 2010 19:02
  • 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;
       }
       
      }
    
    Grüße

     

    Freitag, 15. Oktober 2010 13:23

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;
       }
       
      }
    
    Grüße

     

    Freitag, 15. Oktober 2010 13:23
  • Wow coole Sache, danke
    Freitag, 15. Oktober 2010 13:31
  • er sagt mit jetzt aber, dass XDocument im aktuellen Kontext nicht vorhanden ist. es wird doch aber oben definiert. woran kann das denn liegen?
    Freitag, 15. Oktober 2010 13:47
  • Hi ,

    XDocument ist im Namensraum System.Xml.Linq

    Dazu musst du

    using System.Xml.Linq;

    siehe auch: LINK einfügen

    Grüße

    Freitag, 15. Oktober 2010 13:53
  • Danke dir
    Freitag, 15. Oktober 2010 14:26
  • Hey, sagt mal geht das auch anders herum? Also dass ich in die XML datei schreibe?

    Das wäre natülich der Knüller. Oder geht das nicht über die elemente?

    und man müsste sich die xml selber erstellen?

    Freitag, 15. Oktober 2010 17:11
  • hi, über die Value Eigenschaft des jeweiligen elementes/atttributes kannst du den wert setzten und das Dokument speichern
    Freitag, 15. Oktober 2010 17:57
  • 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:

    Öffentliche Methode Reload Aktualisiert die Werte der Anwendungseinstellungseigenschaft aus dem permanenten Speicher.
    Öffentliche Methode Reset Stellt die beibehaltenen Anwendungseinstellungswerte mit den entsprechenden Standardeigenschaften wieder her.
    Öffentliche Methode Save Speichert die aktuellen Werte der Anwendungseinstellungseigenschaften. (Überschreibt SettingsBase.Save)
    Öffentliche Methode ToString Gibt einen String zurück, der das aktuelle Object darstellt. (Von Object geerbt.)
    Öffentliche Methode 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
    Freitag, 15. Oktober 2010 19:02
  • 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 geschrieben

    doc.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?

    Freitag, 15. Oktober 2010 19:28
  • 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

    Freitag, 15. Oktober 2010 19:32
  • Alles klar. danke dir trotzdem für deine doch echt super hilfe eben
    Freitag, 15. Oktober 2010 19:34
  • Als Tipp :

    Du setzt zwar das Element , rufst aber kein Doc.Save auf ;-)

     

    So nu aber ran ans lesen :-) 

    Freitag, 15. Oktober 2010 19:37