none
Wie liest man richtig eine XML ein? RRS feed

  • Frage

  • Hallo, ich habe mal gehört, dass man eine Xml Datei wie eine Tabelle einlesen sollte, weil es auch vorkommen kann, dass elemente mit gleichem Namen in der Datei enthalten sind. Jetzt meine Frage:

    Liest man die Datei dann einfach nach der reihe mit xmlreader.read() ein und weist es den jeweiligen daten zu, also ohne wirklich auszulesen, wie die attribute usw. heisen? oder kontrolliert man diese auf einen namen?

    Wenn man diese ja auch einen namen kontrolliert, dann gibt es ja probleme bei der zuweisung, wenn elemente doppel vorkommen, oder?

    Dachte mir jetzt, dass ich einfach drauf warte, dass ein element vorkommt und dann die attribute den entsprechenden daten zuweise, ohne wirklich abzufragen was es ist. was meint ihr denn?

    Sonntag, 26. Dezember 2010 14:47

Antworten

Alle Antworten

  • Hallo B.,

    man kann es erst sagen, was die geeignete (richtig ist da ein nicht treffendes Wort) Methode ist, wenn die Anforderungen an Dein Gesamtsystem bzgl. dieses Einlesens klar sind. Es gäbe viele Methoden, die richtig und falsch sein können.
    Allgemein kann man schon mal sagen, dass es sehr selten vorkommt, dass man noch explizit "einzeln" über XmlReader o.ä. einliest. Meistens benutzt man vorgefertigte Methoden/Klassen, sodass man nur noch die Klassen und deren (öffentliche) Eigenschaften kennt, aber nicht mehr auf die "tiefe" Ebene des expliziten XML-Handlings geht. 

    Also erstmal die Frage: was ist bei Dir eine "Tabelle". Meinst Du eine Datenbanktabelle, die dann in XML auf die Platte gespeichert werden soll? In dem Fall eignen sich normalerweise immer .NET Datenbank-Methoden, die dem System.Data-Namensraum entspringen - dort gibt es geeignete WriteXml- und ReadXml-Methoden (siehe unten). Kennst Du weiterhin irgendwelche Anforderungen an das XML oder Dein System?

    Typische Methoden zur XML-Serialisierung enstammen zum Beispiel auch dem:

    [System.Xml-Namespace ()]
    http://msdn.microsoft.com/de-de/library/system.xml.aspx

    [System.Xml.Serialization-Namespace ()]
    http://msdn.microsoft.com/de-de/library/system.xml.serialization.aspx

    Gern wird heutzutage auch Linq to XML genommen:

    [LINQ to XML]
    http://msdn.microsoft.com/de-de/library/bb387098.aspx

    oder [DataTable.WriteXml-Methode (System.Data)]  [DataSet.WriteXml-Methode (System.Data)]
    wobei ich jetzt viele noch nicht erwähnt habe.


    ciao Frank
    Sonntag, 26. Dezember 2010 16:07
  • Also es geht bei mir hauptsächlich darum am anfang wenn die Form geladen wird ne  configdatei einzulesen und dann während der Laufzeit werden einige Xml´s geladen, in welchen daten stehen, womit ich textboxen und comboboxen usw. befüllen möchte.

    ist es da sinnvoller die genaue folge der daten zu wissen und dementsprechend einzeln mit Xmlreader.read() auszulesen,

    oder sollte man es da allgemein halten?  Also wie gesagt, es kann ja mal vorkommen, dass es zwei gleichnamige unterelemente gibt und wenn ich dann auf den namen schaue ist das ja problematisch, allerdings wird der sourcecode meiner meinung ja riesig wenn ich große xml dateien habe und die element für element einzen mit read() auslesen möchte. oder? 

    Sonntag, 26. Dezember 2010 16:49
  • Hallo B.,

           > Configdatei einlesen ...

    Da Du wohl Windows Forms meinst, macht man das generell eher über die typsichereren Properties.Settings:
    [Anwendungseinstellungen für Windows Forms]
    Das bringt .NET schon "out of the box" mit. Ein Kümmern um XML ist da normal nicht notwendig.
    [Gewusst wie: Erstellen von Anwendungseinstellungen mithilfe des Designers]

    Man kann auch eigene Klassen erstellen - das Serialisieren in XML (normal eine user.config) an den richtigen Ort übernimmt quasi die Konfigurations-Infrastruktur:

    [Typsichere Settings mit eigenen Array-Typen]
    http://dzaebel.net/SettingsExample2.htm

    Die Reihenfolge hier zu "kennen" ist eher unschön. Das sollte IMHO unabhängig von einer Reihenfolge sein.
    Also klarer Tipp: kein eigener XmlReader hier notwendig.

         > zwei gleichnamige unterelemente ...

    das macht ja nichts, das liest .NET ja dann automatisch richtig ein (und schreibt es richtig), etwa bei Arrays, wie ich zum Beispiel sie in meinem Artikel benutze. [Wie speichere ich Konfigurationseinstellungen meiner Anwender?]

    Interessante Links sicher auch:

    [Controls automatisch serialisieren]
    http://dzaebel.net/SerializeControls.htm

    [Dynamisches Erzeugen von Controls per Reflection und XML]
    http://dzaebel.net/DynamicCreate.htm

    [Steuerelement-Array's serialisieren und DataBinding]
    http://dzaebel.net/TwoLineBinding2.htm


    ciao Frank
    Sonntag, 26. Dezember 2010 18:20
  • > das macht ja nichts, das liest .NET ja dann automatisch richtig ein

    Wie geht das? Ich meine woher soll denn .NET das Format von meiner Xml Datei wissen? ich erzeuge diese ja auch selbst. Sorry, wenn ich auf dem Schleuch stehe, aber verstehe ich nicht.

    Sonntag, 26. Dezember 2010 20:00
  • Nebenbei ... Du hast [hier] auf mein Posting noch nicht geantwortet bzw. den Thread abgeschlossen.

        > woher soll denn .NET das Format von meiner Xml Datei wissen?

    weil "er" sie selber erstellt.


    ciao Frank
    Montag, 27. Dezember 2010 07:45
  • wie weil er sie selber erstellt?

    deswegen kann doch .NET nicht wissen, weles Element, bzw. Welches Attribut ich welcher Variablen zuweisen will. Oder wie?

    Mittwoch, 29. Dezember 2010 22:27
  • Hallo B.,

    Wie es ja in meinen Links steht ...
    Die Konfiguration wird dann zum Beispiel über eine Klasse (z.B. Settings) mit Eigenschaften dargestellt. Diese hat zunächst Standardwerte.

    • Das, was Du den Variablen (also eher den Eigenschaften der Instanz der Klasse) zuweist, kannst Du also zu einem beliebigen Zeitpunkt Deinen Wünschen entsprechend vornehmen.
      Natürlich weiß .NET nicht die "Werte". Es kennt die Eigenschaften der Klasse und kann es deshalb automatisch in XML speichern und lesen und upgraden.

    Die Standardwerte gibt man oft im Projekt/Einstellungen-Designer ein. .NET setzt all dies über sein Konfigurations-Subsystem automatisch in XML um und speichert das dann entsprechend, wenn etwa Properties.Settings.Default.Save(). -> [Info

     


    ciao Frank
    Freitag, 31. Dezember 2010 12:52
  • Sorry, so ganz habe ich es noch nicht vestanden. ich soll also meine werte erst in die klasse speichern und dann in die xml und beim auslesen erst wieder in die klasse und dann den objekten zuweisen?

     

    Hast du vielleicht mal ein kleines Beispiel mit so 2-3 werten? wäre echt super. danke

    Montag, 3. Januar 2011 09:46
  • Hallo B,

    Bin nicht sicher ob ich Dich verstanden habe. Aber wenn Du die Tabellen selber bestimmen kannst,

    hilft Dir vielleicht folgendes weiter wenn es um das befüllen von ComboBoxen etc. geht.

    Hier eine Kurzfassung:

    DataTable mit Werten erstellen:

    string
     strPathAndFile = @"C:\
    Temp\Anrede.xml";
    DataColumn dc;
    DataRow dr;
    //Create Table DataTable dt = new DataTable ("Anrede" );
    dc = new DataColumn ();
    dc.DataType = Type .GetType("System.Int32" );
    dc.ColumnName = "intAnredeID" ;
    dt.Columns.Add(dc); dc = new DataColumn ();
    dc.DataType = Type .GetType("System.String" );
    dc.ColumnName = "strAnrede" ;
    dt.Columns.Add(dc);
    //Add Rows to Table dr = dt.NewRow();
    dr["intAnredeID" ] = "1" ;
    dr["strAnrede" ] = "Keine" ; dt.Rows.Add(dr);
    dr = dt.NewRow();
    dr["intAnredeID" ] = "2" ;
    dr["strAnrede" ] = "Herr" ;
    dt.Rows.Add(dr);
    dr = dt.NewRow();
    dr["intAnredeID" ] = "3" ;
    dr["strAnrede" ] = "Frau" ;
    dt.Rows.Add(dr);
    dt.Constraints.Add("PK_intAnredeID"new DataColumn [] { dt.Columns["intAnredeID" ] }, true );
    DataSet ds = new DataSet ("DsAnrede" );
    ds.Tables.Add(dt);
    ds.WriteXml(strPathAndFile, XmlWriteMode .WriteSchema);

    Tabelle in Dataset einlesen und ComboBox, DataGridView etc. zuweisen:

    string
     strPathAndFile = @"C:\
    Temp\Anrede.xml";
    DataSet ds = new DataSet ();
    ds.ReadXml(strPathAndFile);
    comboBoxAnrede.DataSource = ds.Tables[0];
    comboBoxAnrede.DisplayMember = "strAnrede" ;
    comboBoxAnrede.ValueMember = "int Anrede ID" ;

    Grüsse Robert

     

    Dienstag, 4. Januar 2011 16:38
  • Hallo B.,

        >  ein kleines Beispiel mit so 2-3 werten? wäre echt super. danke

    in meinen Links sind ja mehrere Beispiele. Zum Beispiel:
    http://Dzaebel.NET/Downloads/SettingsExample2.zip
    http://Dzaebel.NET/Downloads/SettingsExample3.zip

     


    ciao Frank
    • Als Antwort markiert Bensen83 Dienstag, 4. Januar 2011 16:54
    Dienstag, 4. Januar 2011 16:53
  • Danke euch, ahbe schon eine gute Methode gefunden es zu schreiben und zu lesen, mache mir attribute, welche ich einlese und nach denen ich dann je nachdem was im attribute "name" steht entscheide ich dann was wohin geschrieben wird. funktioniert super und ist total easy.
    Dienstag, 4. Januar 2011 16:55