[C#] Aus DataSet in XML - aber richtig bitte!

meilon

Erfahrenes Mitglied
Hallo!

Ich möchte eine Art Tabelle im Programm speichern, dafür speichere ich die Daten in in einem XmlDocument (doc) in Properties.Settings.Default. Diese Daten sollen via DataGridView editiert werden können. Jetzt zu meinem Problem:

Eigentlich hatte ich mir als Struktur für die XML folgendes überlegt:
Code:
<children>
  <child name="value" size="blah" foo="bar" />
  <child name="test" size="blub" foo="house" />
</children>

Diese Struktur bekomme ich nur hin, wenn ich sie so in ein DataSet (ds) mit ReadXml hineinlade und dann auch wieder via doc.innerXml = ds.GetXml(); zurückschreibe. Da es aber auch vorkommen kann, dass der User alle "child" löscht, muss für das DataGridView (dgv) im DataSet eine neue Tabelle erstellt werden. Das mache ich momentan so:
Code:
ds.DataSetName = "children";
ds.Tables.Add("child");
ds.Tables[0].Columns.Add("name");
ds.Tables[0].Columns.Add("size");
ds.Tables[0].Columns.Add("foo");
dgv.DataSource = ds.Tables[0].DefaultView;

Jetzt kann ich neue Daten hineinschreiben und auch speichern, nur passiert das jetzt in einem solchen Format
Code:
<children> <!-- kommt nur, wenn man zwei Zeilen hinzugefügt hat. Wieso? -->
  <child>
    <name>value</name>
    <size>skdak</size>
    <foo>shdf</foo>
  </child>
  <child>
    ....
  </child>
</children> <!-- kommt nur, wenn man zwei Zeilen hinzugefügt hat. Wieso? -->

Wie kann ich es so speichern lassen, wie ich es will? Muss ich dafür selber eine Funktion schreiben? Wenn ihr einen anderen Vorschlag habt, wie ich die Daten anordnen soll (evtl. so wie GetXml(); das will?), dann auch her damit!

Grüße
meilon
 

M4st3r

Erfahrenes Mitglied
Da kommst du nicht um die Attribute drum herum. Du kannst beim serialisieren nach XML deinen Properties diverse Attribute zuweisen die dem Serialisierer sagen was er damit tun soll.
Ohne Garantie: Ich glaube das passende Attribute dazu heißt [XmlAttribute]
Wenn du das über deinen getter/setter schreibst dann wird daraus kein XmlElement gemacht - das ist das, was gerade bei dir passiert - sondern es wird eben als Attribute dem Knoten hinzugefügt.
Das Attribut verfügt über einige Überladungen mit denen du unter anderem steuern kannst wie das Attribute heißen soll - default ist der Name des Properties.

OK, zugegeben, das ist ein wenig am Thema vorbei da du ja eine DataTable serialisierst, ich hatte mich aber gerade mit der XmlSerialisierung beschäftigt und wollte mal ne kleine Einführung geben ;-)

Das, was der Serilisierer da per default macht ist doch eigentlich auch nicht schlecht, oder? Was hast du da für ein Problem? Meiner Meinung nach ist das übersichtlicher als das, was du vor hast...
 
Zuletzt bearbeitet:

meilon

Erfahrenes Mitglied
Dagegen habe ich nur etwas, weil es nicht so läuft wie ich mir das vorgestellt habe :D Damit leben könnte ich aber trotzdem.

Dann bleibt nur noch ein Problem zu lösen: Wie bekomme ich auch bei einem Element das Eltern-Element mit dazu? Soll ich manuell überprüfen, ob nur eine Zeile im DataSet existiert und beim speichern dann selber "<children>" + ds.GetXml() + "</children>" machen oder gibt es da eine Eigenschaft, die ich noch nicht gefunden habe?
 

M4st3r

Erfahrenes Mitglied
Hast du mal ausprobiert was passiert wenn du bei .WriteXml(stirng filename, bool writeHierachy) den Wert writeHierachy auf true setzt?
 

meilon

Erfahrenes Mitglied
DataSet kennt diese Überladung nicht! Vor allem möchte ich gar kein XML-Schreiben (auf Festplatte), das XML soll in die Properties gespeichert werden.