verwendetes Datenbanksystem: <XML>
Hallo Zusammen,
Ich habe folgendes Problem, ich möchte ein Englishtool schreiben, welches Aufgabenblätter und ein Lösungsblatt erstellt. Zurzeit habe ich als Notlösung meine Daten so in ein XML gespeichert und in ein Datagriedview angezeigt:
public Boolean SafeItems(List<EnglishItem> pItemList)
{
try
{
int counter = 1;
//XDOC erstellen
while (counter <= 10)
{
XDocument document = new XDocument(
new XDeclaration("1.0", "utf-8", "yes"),
new XComment("Mirza's xml"),
new XElement("EnglishList",
new XElement("EnglishItem",
new XElement("item", new XAttribute("german", "wir sind"), new XAttribute("pastparciple", "we have been"),
new XAttribute("simplepast", "we were"), new XAttribute("infinitive", "we are"), new XAttribute("id", 0))),
new XElement("EnglishItem",
new XElement("item", new XAttribute("german", "ich bin"), new XAttribute("pastparciple", "I have been"),
new XAttribute("simplepast", "I was"), new XAttribute("infinitive", "I am"), new XAttribute("id", 1))),
new XElement("EnglishItem",
new XElement("item", new XAttribute("german", "sein"), new XAttribute("pastparciple", "been"),
new XAttribute("simplepast", "was"), new XAttribute("infinitive", "be"), new XAttribute("id", 2)))));
document.Save("EnglishItems.xml");
counter += 1;
}
return true;
}
catch (Exception)
{
return false;
}
}
public List<EnglishItem> GetXmlContent()
{
List<EnglishItem> EList = new List<EnglishItem>();
var vDoc = XDocument.Load(FilePath);
foreach (XElement x in vDoc.Descendants("EnglishItem"))
{
int i = 1;
foreach (XElement childElement in x.Descendants())
{
EList.Add(new EnglishItem(int.Parse(childElement.Attribute("id").Value), childElement.Attribute("infinitive").Value, childElement.Attribute("german").Value, childElement.Attribute("pastparciple").Value, childElement.Attribute("simplepast").Value));
Console.WriteLine(i);
i++;
}
Debug.WriteLine(x.ToString());
}
return EList;
}
}
}
Jetzt möchte ich es umgekehrt auch speichern können. Wenn ich jetzt die weiteren Datenzeilen in Datagriedview eingebe, sollten sie im XML wieder abgespeichert werden. Wie muss ich den obigen Code ändern, damit es dann funktioniert? Brauche keine fertigen Lösungen sondern nur tipps 😃
Danke und freundliche Grüsse,
mimed
Eine Klasse erstellen für die Vokabeln, diese durch Serialisieren und Deserialisieren speichern/lesen. Die Liste an das DataGridView binden oder ggf. Events davon abonnieren und entsprechend darauf reagieren.
Was meinst du mit einer Klasse für die Vokabeln? Meinst du vielleicht sowas?
namespace Core
{
public class EnglishItem
{
public EnglishItem(int pmId, string pmInfinitive, string pmGerman, string pmPastparticiple, string pmSimplepast)
{
this.mId = pmId;
this.mInfinitive = pmInfinitive;
this.mGerman = pmGerman;
this.mPastparticiple = pmPastparticiple;
this.mSimplepast = pmSimplepast;
}
public EnglishItem()
{
}
public int _Id
{
get
{
return mId;
}
set
{
mId = value;
}
}
public string _infinitive
{
get
{
return mInfinitive;
}
set
{
mInfinitive = value;
}
}
public string _Simplepast
{
get
{
return mSimplepast;
}
set
{
mSimplepast = value;
}
}
public string _Pastparticiple
{
get
{
return mPastparticiple;
}
set
{
mPastparticiple = value;
}
}
public string _German
{
get
{
return mGerman;
}
set
{
mGerman = value;
}
}
public int mId { get; set; }
public string mInfinitive { get; set; }
public string mGerman { get; set; }
public string mPastparticiple { get; set; }
public string mSimplepast { get; set; }
}
Hallo und willkommen,
erkunde dich mal nach der Klasse XmlSerializer.
Einen kurzen Einblick gibt es z.B. unter Mit XmlSerializer Objekte als XML speichern und laden
Deine Vokabel-Klasse ist schon mal ein guter Ansatz. So trennst du dann code-technisch Logik und Persistierung der Daten.
static void Main(String[] args)
{
EnglishItem englishitem = new EnglishItem();
englishitem.mGerman = "sein";
englishitem.mId = 1;
englishitem.mInfinitive = "test";
englishitem.mPastparticiple = "testtest";
englishitem.mSimplepast = "testtesttest";
EnglishItem englishitem2 = new EnglishItem();
englishitem2.mGerman = "sein2";
englishitem2.mId = 2;
englishitem2.mInfinitive = "test2";
englishitem2.mPastparticiple = "testtest2";
englishitem2.mSimplepast = "testtesttest2";
List<EnglishItem> englishitems = new List<EnglishItem> { englishitem, englishitem2 };
SerializeToXML(englishitems);
}
static public void SerializeToXML(List<EnglishItem> englishitems)
{
XmlSerializer serzializer = new XmlSerializer(typeof(EnglishItem));
TextWriter textwriter = new StreamWriter(@"C:\Englishitem.xml");
serzializer.Serialize(textwriter, englishitems);
textwriter.Close();
}
Ich habe folgenden Code geschrieben. Bin ich auf der richtigen Richtung?
Ja, fast. Einzig dem XmlSerializer mußt du noch den richtigen Typ mitgeben, d.h.
XmlSerializer serializer = new XmlSerializer(typeof(List<EnglishItem>)); // List anstatt nur Item
(ich habe auch den Schreibfehler beim Variablennamen korrigiert 😉
Alles weitere solltest du dann durch Testen hinkriegen...
Jetzt sollte es eigentlich in meinem Datagridview anzeigen, die ich erstellt habe. Wo könnte ich noch einen Fehler haben?
namespace DL
{
public class DL
{
const String FilePath = "EnglishItems.xml";
/// <summary>
/// Was mach ich hier ?
/// </summary>
/// <param name="pItemList">Liste aus EnglischenItems</param>
/// <returns>Hat es funktioniert?</returns>
///
static void Main(String[] args)
{
EnglishItem englishitem = new EnglishItem();
englishitem.mGerman = "sein";
englishitem.mId = 1;
englishitem.mInfinitive = "test";
englishitem.mPastparticiple = "testtest";
englishitem.mSimplepast = "testtesttest";
EnglishItem englishitem2 = new EnglishItem();
englishitem2.mGerman = "sein2";
englishitem2.mId = 2;
englishitem2.mInfinitive = "test2";
englishitem2.mPastparticiple = "testtest2";
englishitem2.mSimplepast = "testtesttest2";
List<EnglishItem> englishitems = new List<EnglishItem> { englishitem, englishitem2 };
SerializeToXML(englishitems);
}
static public void SerializeToXML(List<EnglishItem> englishitems)
{
XmlSerializer serializer = new XmlSerializer(typeof(List<EnglishItem>)); // List anstatt nur Item
TextWriter textwriter = new StreamWriter(@"C:\Users\mimed\Documents\Visual Studio 2013\Projects\FL\FL\bin\Debug\EnglishItems.xml");
serializer.Serialize(textwriter, englishitems);
textwriter.Close();
}
public Boolean SafeItems(List<EnglishItem> pItemList)
{
try
{
int counter = 1;
//XDOC erstellen
while (counter <= 10)
{
XDocument document = new XDocument(
new XDeclaration("1.0", "utf-8", "yes"),
new XComment("Mirza's xml"),
new XElement("EnglishList",
new XElement("EnglishItem",
new XElement("item", new XAttribute("german", "wir sind"), new XAttribute("pastparciple", "we have been"),
new XAttribute("simplepast", "we were"), new XAttribute("infinitive", "we are"), new XAttribute("id", 0))),
new XElement("EnglishItem",
new XElement("item", new XAttribute("german", "ich bin"), new XAttribute("pastparciple", "I have been"),
new XAttribute("simplepast", "I was"), new XAttribute("infinitive", "I am"), new XAttribute("id", 1))),
new XElement("EnglishItem",
new XElement("item", new XAttribute("german", "sein"), new XAttribute("pastparciple", "been"),
new XAttribute("simplepast", "was"), new XAttribute("infinitive", "be"), new XAttribute("id", 2)))));
document.Save("EnglishItems.xml");
counter += 1;
}
return true;
}
catch (Exception)
{
return false;
}
}
public List<EnglishItem> GetXmlContent()
{
List<EnglishItem> EList = new List<EnglishItem>();
var vDoc = XDocument.Load(FilePath);
foreach (XElement x in vDoc.Descendants("EnglishItem"))
{
int i = 1;
foreach (XElement childElement in x.Descendants())
{
EList.Add(new EnglishItem(int.Parse(childElement.Attribute("id").Value), childElement.Attribute("infinitive").Value, childElement.Attribute("german").Value, childElement.Attribute("pastparciple").Value, childElement.Attribute("simplepast").Value)); //Console.WriteLine(childElement);
Console.WriteLine(i);
i++;
}
Debug.WriteLine(x.ToString());
}
return EList;
}
}
}
Ich habe noch die andere Variante drin gelassen. Was muss ich hier noch anpassen ich komme einfach nicht drauf? Danke und Gruss
Ich behaupte dir fehlt eine "DeserializeFromXML"-Methode.
Wissen ist nicht alles. Man muss es auch anwenden können.
PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |
namespace DL
{
public class DL
{
const String FilePath = "EnglishItems.xml";
/// <summary>
/// Was mach ich hier ?
/// </summary>
/// <param name="pItemList">Liste aus EnglischenItems</param>
/// <returns>Hat es funktioniert?</returns>
///
static void Main(String[] args)
{
EnglishItem englishitem = new EnglishItem();
englishitem.mGerman = "sein";
englishitem.mId = 1;
englishitem.mInfinitive = "test";
englishitem.mPastparticiple = "testtest";
englishitem.mSimplepast = "testtesttest";
EnglishItem englishitem2 = new EnglishItem();
englishitem2.mGerman = "sein2";
englishitem2.mId = 2;
englishitem2.mInfinitive = "test2";
englishitem2.mPastparticiple = "testtest2";
englishitem2.mSimplepast = "testtesttest2";
List<EnglishItem> englishitems = new List<EnglishItem> { englishitem, englishitem2 };
SerializeToXML(englishitems);
}
static public void SerializeToXML(List<EnglishItem> englishitems)
{
XmlSerializer serializer = new XmlSerializer(typeof(EnglishItem));
TextWriter textwriter = new StreamWriter(@"C:\Englishitem.xml");
serializer.Serialize(textwriter, englishitems);
textwriter.Close();
}
private static void BasicDeSerializationMethod()
{
// Create an instance of BasicSerialization class.
EnglishItem serializeObject = new EnglishItem();
// Create an instance of new TextReader.
TextReader txtReader = new StreamReader(@"C:\Englishitem.xml");
// Create and instance of XmlSerializer class.
XmlSerializer xmlSerializer = new XmlSerializer(typeof(EnglishItem));
// Deserialize from the StreamReader.
serializeObject = (EnglishItem)xmlSerializer.Deserialize(txtReader);
// Close the stream reader
txtReader.Close();
}
public Boolean SafeItems(List<EnglishItem> pItemList)
{
try
{
int counter = 1;
//XDOC erstellen
while (counter <= 10)
{
XDocument document = new XDocument(
new XDeclaration("1.0", "utf-8", "yes"),
new XComment("Mirza's xml"),
new XElement("EnglishList",
new XElement("EnglishItem",
new XElement("item", new XAttribute("german", "wir sind"), new XAttribute("pastparciple", "we have been"),
new XAttribute("simplepast", "we were"), new XAttribute("infinitive", "we are"), new XAttribute("id", 0))),
new XElement("EnglishItem",
new XElement("item", new XAttribute("german", "ich bin"), new XAttribute("pastparciple", "I have been"),
new XAttribute("simplepast", "I was"), new XAttribute("infinitive", "I am"), new XAttribute("id", 1))),
new XElement("EnglishItem",
new XElement("item", new XAttribute("german", "sein"), new XAttribute("pastparciple", "been"),
new XAttribute("simplepast", "was"), new XAttribute("infinitive", "be"), new XAttribute("id", 2)))));
document.Save("EnglishItems.xml");
counter += 1;
}
return true;
}
catch (Exception)
{
return false;
}
}
public List<EnglishItem> GetXmlContent()
{
List<EnglishItem> EList = new List<EnglishItem>();
var vDoc = XDocument.Load(FilePath);
foreach (XElement x in vDoc.Descendants("EnglishItem"))
{
int i = 1;
foreach (XElement childElement in x.Descendants())
{
EList.Add(new EnglishItem(int.Parse(childElement.Attribute("id").Value), childElement.Attribute("infinitive").Value, childElement.Attribute("german").Value, childElement.Attribute("pastparciple").Value, childElement.Attribute("simplepast").Value)); //Console.WriteLine(childElement);
Console.WriteLine(i);
i++;
}
Debug.WriteLine(x.ToString());
}
return EList;
}
}
}
Es passiert einfach nichts. Ich komme einfach nicht ans Resultat, wisst ihr vielleicht wo ich den Fehler habe?
Lies nochmal meinen letzten Beitrag.
Lies nochmal meinen letzten Beitrag.
Ich habe es angepasst aber funktioniert leider immer noch nicht richtig soll ich den anderen code rauslöschen?
Verwendest du denn jetzt in der Serialize als auch der Deserialize-Methode beidesmal "List<EnglishItem>"?
P.S: Und ja, editiere mal deinen letzten Code, so daß nur noch die Main, SerializeToXML sowie BasicDeSerializationMethod (btw. diese solltest du besser DeserializeFromXML nennen) drinstehen.
Verwendest du denn jetzt in der Serialize als auch der Deserialize-Methode beidesmal "List<EnglishItem>"?
P.S: Und ja, editiere mal deinen letzten Code, so daß nur noch die Main, SerializeToXML sowie BasicDeSerializationMethod (btw. diese solltest du besser DeserializeFromXML nennen) drinstehen.
jaa beidesmal steht List<EnglishItem>
ich Möchte das nun auf einen Button weitergeben vom über den Button zum Businesslayer zum Datalayer, nun geht da wieder was schief:
namespace BL
{
public class _BL
{
public Boolean Save(List<EnglishItem> pEIlist)
{
DL.DL Datalayer = new DL.DL();
return Datalayer.DeserializeFromXml(pEIlist);
}
/// <summary>
/// Was wird hier gemacht
/// </summary>
/// <returns>Was kommt zurück</returns>
public List<EnglishItem> GetXmlContent()
{
DL.DL Datalayer = new DL.DL();
return Datalayer.SerializeToXML();
}
}
}
Hi mimed,
SerializeToXml serialisiert Daten in ein XML-Dokument (wie der Name schon sagt). Es gibt also keine Businessdaten zurück, sondern erwartet sie als Parameter um sie zu serialisieren. Andersherum erstellt die DeserializeFromXml-Methode Businessobjekte aus einem Xml-Dokument. Du verwendest die beiden Methoden also genau verkehrtherum.
Christian
Edit: Übrigens sollten die Daten nicht einfach auf C:\ gespeichert werden, sondern im Anwendungsdaten-Verzeichnis (AppData).
Weeks of programming can save you hours of planning
Hi mimed,
SerializeToXml serialisiert Daten in ein XML-Dokument (wie der Name schon sagt). Es gibt also keine Businessdaten zurück, sondern erwartet sie als Parameter um sie zu serialisieren. Andersherum erstellt die DeserializeFromXml-Methode Businessobjekte aus einem Xml-Dokument. Du verwendest die beiden Methoden also genau verkehrtherum.
Christian
Edit: Übrigens sollten die Daten nicht einfach auf C:\ gespeichert werden, sondern im Anwendungsdaten-Verzeichnis (AppData).
Danke für deine Antwort, könntest du mir vielleicht zeigen wie ich das nun erstellen sollte? ich hab jetzt den Durchblick verloren. Also bei mir siehts nun so aus:
static void Main(String[] args)
{
EnglishItem englishitem = new EnglishItem();
englishitem.mGerman = "sein";
englishitem.mId = 1;
englishitem.mInfinitive = "test";
englishitem.mPastparticiple = "testtest";
englishitem.mSimplepast = "testtesttest";
EnglishItem englishitem2 = new EnglishItem();
englishitem2.mGerman = "sein2";
englishitem2.mId = 2;
englishitem2.mInfinitive = "test2";
englishitem2.mPastparticiple = "testtest2";
englishitem2.mSimplepast = "testtesttest2";
List<EnglishItem> englishitems = new List<EnglishItem> { englishitem, englishitem2 };
SerializeToXML(englishitems);
}
static public void SerializeToXML(List<EnglishItem> englishitems)
{
XmlSerializer serializer = new XmlSerializer(typeof(List<EnglishItem>));
TextWriter textwriter = new StreamWriter(FilePath);
serializer.Serialize(textwriter, englishitems);
textwriter.Close();
}
public EnglishItem DeserializeFromXml()
{
XmlSerializer serializer = new XmlSerializer(typeof(List<EnglishItem>));
TextReader txtstream = new StreamReader(FilePath);
//Die Deserialize()-Methode gibt ein Object zurück. => casten!
EnglishItem EIList = serializer.Deserialize(txtstream) as EnglishItem;
txtstream.Close();
return EIList;
}
Der obige Code sollte nun stimmen.
public class _BL
{
public Boolean Save(List<EnglishItem> pEIlist)
{
DL.DL Datalayer = new DL.DL();
return Datalayer.DeserializeFromXml(pEIlist);
}
/// <summary>
/// Was wird hier gemacht
/// </summary>
/// <returns>Was kommt zurück</returns>
public List<EnglishItem> GetXmlContent()
{
DL.DL Datalayer = new DL.DL();
return Datalayer.SerializeToXML();
}
}
Wie sollte ich nun den Code hier umgekehrt aufbauen?
EDIT: Bin kein Profi im Programmieren, bis jetzt musste ich es mir mühsam erarbeiten :p
ich hab jetzt den Durchblick verloren.
Dann hilft es dir aber auch nicht, wenn dir jemand den richtigen Code schreibt (mal ganz abgesehen davon, daß das Forum nicht dafür da ist, siehe [Hinweis] Wie poste ich richtig?).
Da du schon über solche grundlegenden Ansätze wie Serialisierung und Deserialisierung stolperst, würde es dir viel mehr helfen, erstmal alles wegzulegen und dich mit den Grundlagen auseinanderzusetzen. Schau dir Tutorials dazu im Internet an und auch zu der Trennung der unterschiedlichen Schichten. Dann kannst du dir deinen Code nochmal anschauen und merkst sicherlich selbst gleich, was da nicht stimmt.
So kommen wir jedenfalls in dem Beitrag auf keinen grünen Zweig, deshalb ist jetzt hier auch zu. Solltest du dann konkrete Fragen haben, kannst du einen neuen Thread dazu aufmachen.
Christian
Weeks of programming can save you hours of planning