none
Read XML - Daten in Klasse speichern C# RRS feed

  • Frage

  • Hallo, 

    Ich befülle die Klasse WFXMLValue mit Daten aus einer XML-Datei.

    Wie wäre jetzt der Weg, die Daten abzurufen z.B.: aus eine anderen Klasse?

    Danke!


    Montag, 20. April 2015 12:38

Antworten

  • Hallo Stefan,

    ja, das abrufbereit hab ich gemeint (sorry), die Möglichkeit zu haben während der
    Laufzeit auf die Daten zu zugreifen.
    Die aktuelle Lösung von mir, sieht so aus:

    //XML-File:

    <?xml version="1.0" encoding="utf-8"?>
    <Document>
      <Betrieb>20</Betrieb>
    </Document>

    public class WFXML
    {
    public void ReadXML(string xmlfile, EventArgs e, WFWriteLog log)
    	{
            XDocument oXML = XDocument.Load(xmlfile);
            foreach (var node in oXML.Elements("Document"))
            {
            	if (node.Element("Betrieb").Value != "")
                    {
                    	betrieb = int.Parse(node.Element("Betrieb").Value);
                    }
    	}
    }
    
    public int betrieb { get; set; }
    }

    In diesem Fall muss ich immer ein Objekt der Klasse WFXML erzeugen file übergeben dann habe ich meine Daten.

    Das schaut simpel aus aber es funktioniert.

    Gruß Daniel



    Mittwoch, 22. April 2015 15:02

Alle Antworten

  • Hallo Daniel,

    wo der Sinn in deinem Klassenaufbau sein soll, verstehe ich nicht.

    So oder so musst Du die Inhalte auf Klassen- und nicht auf Methodenebene bereitstellen.

    Es wäre daher sinnvoll, wenn Du in der Klasse WFXML eine Eigenschaft erstellen würdest und diese dann anstelle der lokalen Variable "x" befüllst.

    public class WFXML
    {
    
        public WFXMLValue Value { get; set; }
    
        ...
    }
    

    In dem Fall befüllst Du eben this.Value = ... und nicht var x.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Montag, 20. April 2015 12:56
    Moderator
  • Hi Stefan,

    hmm momentan hänge ich in der Leitung...

    Andere Frage, was wäre die "schönste" Variante Daten aus einer XML- Datei zu lesen und diese abrufbereit zu stellen?

    Danke


    Montag, 20. April 2015 13:04
  • Hallo Daniel,

    das kommt auf die Datenstruktur in der XML Datei an. Wenn das eine klare (wenn auch komplexe) Struktur ist, die sich in Klassen abbilden lassen würde, empfehle ich in der Regel XML Serialisierung/Deserialisierung.

    Ein Beispiel hierfür findest Du bspw. hier:

      https://social.msdn.microsoft.com/Forums/windowsapps/de-DE/bc844cd9-c685-4ab2-8916-68367894c359/xml-datei-auslesen?forum=visualcsharpde

      https://social.msdn.microsoft.com/Forums/vstudio/de-DE/cdfb4a05-293b-4c5d-87e7-93f8b8f18ee4/textdatei-zur-variablen-machen?forum=visualcsharpde


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Montag, 20. April 2015 13:28
    Moderator
  • Hallo,

    wenn wir in unseren Projekten Daten (z. B. aus einer XML-Datei) einlesen, dann sollen diese typischerweise verwendet werden und gehen daher in die Objekte der Klassen, welche die eingelesenen Daten benötigen.
    Der Zweck einer eigenen Klassenstruktur, die dann das XML-Dokument nachbildet erschließt sich mir daher auch nicht - man bedenke, dass es einfach möglich ist den entsprechenden XmlNode abzufragen, dessen Daten man benötigt.
    Ich denke die "schönste" Variante wäre die Daten schon beim einlesen dort zu hinterlegen wo man diese später benötigt.

    Gruß


    - Florian

    Montag, 20. April 2015 13:37
  • Hallo Florian,

    insbesondere beim Datenaustausch, dem Speichern und Wiederherstellung von Einstellungen, kleineren Datenlisten, usw. ist es schon sinnvoll, die XML Struktur mit Klassen nachzubauen.

    Wenn man nur gezielt einzelne Werte an verschiedenen Stellen der eigenen Anwendung benötigt, ist die Deserialiserung natürlich nicht zielführend. Da wir beide aber nicht wissen, was Daniel nun wo wie genau haben will, warte ich für meinen Teil mal auf Daniels Antwort hierzu :)


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Montag, 20. April 2015 13:57
    Moderator
  • Hallo Stefan,

    Ziel der ganzen Sache ist: Dokumente werden im ERP - System erstellt (Rechnungen) zu diesen Rechnungen werden XML-files erstellt wo die Werte hinterlegt sind. Rechnung.pdf und Rechnung.xml suche ich zusammen, importiere Rechnung.pdf  in das Archiv-System. XML-Files wird ausgelesen und das Rechnung.pdf Dokument wird indexiert.

    Nun bin ich am überlegen, wie ich das am "schönsten" lösen kann, wie die Struktur sein soll das die Daten immer abrufbereit stehen...

    Ein paar Beispiele habt Ihr mir schon geschickt, werde schauen was ich zusammenbringe ;)

    Ich hoffe dass es verständlich war.

    Danke

    Gruß

    Montag, 20. April 2015 14:19
  • Hallo Florian,

    Danke für deinen Beitrag.

    Gruß

    Montag, 20. April 2015 18:01
  • Hallo Stefan.
    Das ist sicherlich richtig. Ist mir aber so noch nicht untergekommen, das Klassenstrukturen mit XML-Strukturen korrelliert hätten - was sicher mitunter damit zu tun hat, dass sich reine Datenklassen regelmäßig als Designschwäche identifizieren lassen, soll heißen diese Daten gehören meist doch zu einer Klasse mit einer bestimmten Funktionalität. In der XML-Struktur hat man hingegen keine Funktionalität, sondern nur Daten. Könnte in diesem Fall aber möglicherweise doch passen, daher will ich das nicht einfach ausschließen.

    Hallo Danijel,
    hoffe der Beitrag bringt dich auch ein Stück weiter. Mir ist nicht ganz klar, wie das mit dem "immer abrufbereit" gemeint ist. Geht es darum die Daten auf verschiedene Arten darzustellen? Wird auf den Daten noch gearbeitet, bzw. werden diese zur Ermittelung weiterer Zusammenhänge verwendet?
    Falls es um Darstellung geht, könnte es vielleicht sinnvoll sein, die verschiedenen Darstellung per XSLT zu erzeugen.
    Falls die Daten über die Laufzeit hinaus benötigt werden, könnte vielleicht eine Datenbank sinnvoll sein.

    Gruß

    - Florian

    Dienstag, 21. April 2015 07:16
  • Hallo Florian,

    reine Datenklassen als Designschwäche? Netter Ansatz :) Aber IMHO doch ziemlich an der Realität vorbei. Vor allen Dingen, wenn man sich überwiegend mit Anwendungen beschäftigt, die Datenstrukturen verarbeiten und das dürften die meisten Anwendungen sein.

    Dass die Daten von der Logik getrennt sein sollten, ist hoffentlich kein Punkt, über den man diskutieren muss. Und daraus ergibt sich automatisch die Notwendigkeit, Klassen für die Datenhaltung zu haben.

    Ich für meinen Teil arbeite in der Regel mit Datenbanken unterschiedlichster Art. Und die Strukturen bilde ich natürlich in Klassen ab, sei es selbst oder durch einem O/R Mapper automatisch erstellt.

    Wenn Daten in anderen Systemen benötigt werden, stellt man diese bspw. über Webservices bereit. Je nach Client als XML oder als JSON. Beim zurückliefern kommt ebenfalls dieses Format zum tragen. Ob da noch was drumherum steht oder nicht, für den Datenaustausch stehen irgendwo strukturierte Daten und die baut man sicher nicht von Hand zu Fuß auf.

    Ich würde sogar soweit gehen, zu behaupten, dass genau das Gegenteil deiner Aussage "reine Datenklassen regelmäßig eine Designschwäche" der Fall ist. Wenn man die Datenklassen mit Logik versieht, hat man was falsch gemacht.

    Wie gesagt, für manche Anforderungen ist die Methode mit dem gezielten Auslesen völlig Ok. Aber in vielen/den meisten Fällen sieht es doch anders aus.

    Mich persönlich würde aber schon interessieren, warum Du reine Datenklassen in der Regel als Designschwäche ansiehst. Ich mag ja nicht auschließen, dass ich die letzten > 15 Jahre was komplett falsch mache :)


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Dienstag, 21. April 2015 19:35
    Moderator
  • Hallo Stefan,

    deine Meinung steht dir letztlich frei, ich teile diese nicht. Dies nicht nur aus eigener Erfahrung sondern auch aus entsprechender Literatur und Diskussion an anderer Stelle. Ich muss hier wohl zugeben, dass ich mir die Bezeichnung als Designschwäche nicht selbst ausgedacht habe. Eine Suche nach "Data Class" wird schnell zu Entsprechendem führen. Da es dem Thema hier aber nicht zuträglich ist grundsätzliche Designfragen zu klären und dies anderswo schon hinreichend diskutiert wurde, will ich dies hier auch nicht weiter ausführen.

    Wie ich bereits schrieb, lehne ich es nicht grundsätzlich ab, nur sollte man dafür dann auch gute Gründe haben. Diese Gründe liegen, wie ich deiner Aussage entnehme, bei Dir wohl regelmäßig vor.

    Gruß


    - Florian

    Mittwoch, 22. April 2015 07:06
  • Hallo Stefan,

    ja, das abrufbereit hab ich gemeint (sorry), die Möglichkeit zu haben während der
    Laufzeit auf die Daten zu zugreifen.
    Die aktuelle Lösung von mir, sieht so aus:

    //XML-File:

    <?xml version="1.0" encoding="utf-8"?>
    <Document>
      <Betrieb>20</Betrieb>
    </Document>

    public class WFXML
    {
    public void ReadXML(string xmlfile, EventArgs e, WFWriteLog log)
    	{
            XDocument oXML = XDocument.Load(xmlfile);
            foreach (var node in oXML.Elements("Document"))
            {
            	if (node.Element("Betrieb").Value != "")
                    {
                    	betrieb = int.Parse(node.Element("Betrieb").Value);
                    }
    	}
    }
    
    public int betrieb { get; set; }
    }

    In diesem Fall muss ich immer ein Objekt der Klasse WFXML erzeugen file übergeben dann habe ich meine Daten.

    Das schaut simpel aus aber es funktioniert.

    Gruß Daniel



    Mittwoch, 22. April 2015 15:02
  • Hallo Daniel,

    ich denke das Du es so machen kannst. Ist auch kein schlechtes Zeichen, wenn es "simpel" aussieht.

    Gruß


    - Florian

    Montag, 27. April 2015 08:48