 |
|
|
24.02.13, 10:41
|
#1
|
Anfänger
Registriert seit: Mar 2012
Beiträge: 42
Bedankt: 1
|
C# & xml
Hi
ich habe ein kleines problem mit xml datein.
Ich möchte Pfade (48 * 32) sortiert in einer xml-Datei speichern.
allerdings werden bei mir immer nur die letzten beiden erstellt.
Hat dafür jmd eine lösung?
Code:
for (int i = 1; i < 49; i++)
{
for (int j = 1; j < 33; j++)
{
XmlDocument doc = new XmlDocument();
XmlNode myRoot, myNode;
myRoot = doc.CreateElement("icon"+j);
doc.AppendChild(myRoot);
myNode = doc.CreateElement("gp"+i+"_image");
myNode.InnerText = "";
myRoot.AppendChild(myNode);
myNode = doc.CreateElement("gp"+i+"_shortcut");
myNode.InnerText = "";
myRoot.AppendChild(myNode);
doc.Save(@"\icons.xml");
}
}
So sieht die xml-Datei dann aus:
Code:
<icon32>
<gp48_image>
</gp48_image>
<gp48_shortcut>
</gp48_shortcut>
</icon32>
MfG ipulf2
|
|
|
24.02.13, 12:01
|
#2
|
Anfänger
Registriert seit: Apr 2012
Beiträge: 43
Bedankt: 16
|
Weil du immer ein neues XmlDocument erstellst und dadurch die alten Inhalte überschreibst.
XmlDocument doc = new XmlDocument(); ausserhalb der schleife erzeugen.
|
|
|
24.02.13, 12:22
|
#3
|
Anfänger
Registriert seit: Mar 2012
Beiträge: 42
Bedankt: 1
|
Hier der neue code
Code:
XmlDocument doc = new XmlDocument();
XmlNode myRoot, myNode;
for (int i = 1; i < 49; i++)
{
for (int j = 1; j < 33; j++)
{
myRoot = doc.CreateElement("icon"+j);
doc.AppendChild(myRoot);
myNode = doc.CreateElement("gp"+i+"_image");
myNode.InnerText = "";
myRoot.AppendChild(myNode);
myNode = doc.CreateElement("gp" + i + "_shortcut");
myNode.InnerText = "";
myRoot.AppendChild(myNode);
doc.Save(@"C:\icons.xml");
}
}
und die neue xml:
Code:
<icon1>
<gp1_image>
</gp1_image>
<gp1_shortcut>
</gp1_shortcut>
</icon1>
Funktioniert leider immer noch nicht
edit: Das doc.save außerhalb der schleife zu packen habe ich ebenfalls versucht (die xml wird dann nicht mehr erstellt).
|
|
|
24.02.13, 13:53
|
#4
|
Anfänger
Registriert seit: Apr 2012
Beiträge: 43
Bedankt: 16
|
Code:
XmlDocument doc = new XmlDocument();
for (int i = 1; i < 49; i++) {
for (int j = 1; j < 33; j++) {
XmlNode myRoot = doc.CreateElement("icon"+j);
doc.AppendChild(myRoot);
XmlNode myNode1 = doc.CreateElement("gp"+i+"_image");
myNode1.InnerText = "";
myRoot.AppendChild(myNode1);
XmlNode myNode2 = doc.CreateElement("gp" + i + "_shortcut");
myNode2.InnerText = "";
myRoot.AppendChild(myNode2);
}
}
doc.Save(@"C:\icons.xml");
Probier das mal.
vorher hast du immer nur 2 Objekte für die XML Knoten gehabt (myRoot und myNode), diese sind zwar immer mit doc.CreateElement überschrieben worden, jedoch weiß ich nicht was die Methode "CreateElement" genau macht (kann sein das er nicht ein neues Objekt erzeugt), dadurch wurden womöglich die alten objekte überschrieben und keine neuen XML-Knoten hinzugefügt.
|
|
|
24.02.13, 14:46
|
#5
|
Anfänger
Registriert seit: Mar 2012
Beiträge: 42
Bedankt: 1
|
konnte nun alles lösen vielen dank für die Hilfe
Wenn erneut Probleme auftreten werde ich diese in diesem theard posten :P
|
|
|
24.02.13, 16:43
|
#6
|
Banned
Registriert seit: Mar 2012
Beiträge: 337
Bedankt: 93
|
Oh Gott... verwende doch die XML-Attributes und den XMLSerializer und Du brauchst keine einzige Zeile programmieren!
|
|
|
25.02.13, 16:16
|
#7
|
Anfänger
Registriert seit: Mar 2012
Beiträge: 42
Bedankt: 1
|
Hast du ein Beispiel dafür?
Kann mir nicht vorstellen wie sich das von selbst dort hinein laden soll^^
|
|
|
25.02.13, 18:07
|
#8
|
Banned
Registriert seit: Aug 2012
Beiträge: 223
Bedankt: 68
|
@ipulf2,
Du solltest Dich mal in Objekt-orientiere Programmierung einlesen.
C# ist z.B. eine Objekt-orientiere Programmiersprache, und der Sinn solcher Sprache ist es, eben objekt-orientiert zu programmieren.
Das was Du machst ist prozedurale Programmierung. Die Vorteile der OOP können so also nicht zur Geltung kommen. Würdst Du nach OOP-Kritieren programmieren, dann würdest Du Dein Icon als Objekt beschreiben mit den entsprechenden Membern (image, shortcut). Dann fügst Du noch Attribute (Annotations!) hinzu, die beschreiben, wie das Objekt in XML serialisiert werden soll.
Damit brauchst Du KEINE EINZIGE Zeile programmieren, weil Du eben die OOP-Vorteile verwendest.
(Btw... Du solltest Dich schon selbst fragen, wieso Du eine OO-Programmiersprache verwendst, aber prozedural programmierst...!!!)
|
|
|
25.02.13, 21:39
|
#9
|
Anfänger
Registriert seit: Apr 2012
Beiträge: 43
Bedankt: 16
|
Schau mal hier vorbei: [ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]
Über deine Klasse und Members kannst du Attributes einfügen, die teilen dem XMLSerializer mit wie er die Klasse (genauer gesagt Objekte davon) (de)serialisieren soll.
Du musst nur mehr den XMLSerializer aufrufen:
Code:
XmlSerializer serializer = new XmlSerializer(typeof(MyCoolClass));
FileStream fs = new FileStream("MyXML.xml", FileMode.Create);
serializer.Serialize(fs, myCoolClassObject);
fs.Close();
Falls dir egal ist, in welchen Format deine Daten gespeichert werden könntest du dir natürlich auch einmal JSON ([ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]) zu Gemüte führen, ist um einiges kompakter als XML. Empfohlener Serializer für das .NET Framework: [ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]
|
|
|
Themen-Optionen |
|
Ansicht |
Hybrid-Darstellung
|
Forumregeln
|
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren
HTML-Code ist Aus.
|
|
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:52 Uhr.
().
|