Laden...

C# XML Quiz erstellen

Erstellt von max_0512 vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.556 Views
M
max_0512 Themenstarter:in
1 Beiträge seit 2013
vor 10 Jahren
C# XML Quiz erstellen

verwendetes Datenbanksystem: <XML>

Hallo.. ich habe in der Schule die Aufgabe bekommen ein Quiz zu erstellen. Es soll eine Quizfrage mit 2-6 Antwortmöglichkeiten geben, die Frage soll außerdem eine Kategorie haben. Also habe ich mir gedacht, alle Fragen einer Kategorie in ein XML-File zu speichern!

Folgende Überlegung


<xmlfile>
	<Frage1>
                    <Frage>Hier kommt die erste Frage hin!<Frage>
	           <A1 true ="true">ja</A1>
	           <A2>ja</A2>
	           <A3>ja</A3>
	           <A4>nein</A4>
	          <A5>nein</A5>
	          <A6>nein</A6>
	</Frage1>
         <Frage2>
              .........
         </Frage2>
</xmlfile>

Jedoch bekomme ich es leider nicht hin, dieses Format mittels C# zu speichern.. Wäre für jede Hilfe sehr dankbar.
--Mein größtes Problem ist die Erstellung von Untergeordneten Datensätzen..Also Dass in <frage> dann <a1>...<a6> steht, und dann erst </frage> wieder zu geht!

mfg

1.029 Beiträge seit 2010
vor 10 Jahren

Hi,

zuerst wird die Aufgabe keiner für dich übernehmen - wir setzen Grundwissen voraus.

Damit du nicht leer ausgehst: Lies dich mal in Linq2Xml ein, mach 1-2 Tutorials - dann ist das ein Kinderspiel.

LG

PS: Ein Xml-File je Kategorie halt ich für unnötig... Nimm doch einfach ein Attribut bei den Fragen.
(So viele werden es bestimmt nicht, als dass mehr wie ein File sinnvoll sein könnte...)

476 Beiträge seit 2004
vor 10 Jahren

Hallo max_0512,

ich würde mir auch an deiner Stelle nochmal Gedanken über die XML-Struktur machen. Hier findest Du eine kleine Beschreibung zum XML Grundaufbau. Hier noch etwas inhaltliches zu XML Datenmodellierung und XML-Schemasprachen.

-yellow

Selbst ein Weg von tausend Meilen beginnt mit einem Schritt (chinesisches Sprichwort).

Mein Blog: Yellow's Blog auf sqlgut.de

2.079 Beiträge seit 2012
vor 10 Jahren

Warum erstellst du nicht einfach eine Klasse für die Fragen:

public class Frage
{
    public string Text {get; set; }
    public Dictionary<char, Antwort> Antworten { get; set; }
    public Kategorie Kategorie { get; set; }

    public Frage()
    {
        Antworten = new XmlSerializableDictionary<char, Antwort>();
    }
}

Die Klasse Antwort:

public class Antwort
{
    public string Text { get; set; }
    public bool Wahr { get; set; }
}

Die Klasse Kategorie:

public class Kategorie
{
    public string Name { get; set; }
}

Und hier alle Fragen auf einem Schlag:

public class AlleFragen
{
    public List<Frage> Fragen { get; set; }

    public AlleFragen()
    {
        Fragen = new List<Frage>();
    }
}

Und dann schreibst du noch eine Klasse, die dafür zuständig ist, Alle Fragen aus einer Datei zu laden oder in eine Datei zu speichern.
Und das machst du mit diesem Prinzip:

Einfache XML-Serialisierung in C#

Allerdings kann Xml das Dictionary von Haus aus nicht serialisieren, daher musst du ein serialisierbares Dictionary nehmen. Über Google findet man da folgendes:

SerializableDictionary using IXmlSerializable

Da kannst du einen String lesen oder in einen String schreiben und der steht dann halt in der Datei.

Solange du kein XML-Dokument analysieren musst und es eigentlich nur um simples Laden oder Speichern geht, brauchst du kein LINQ to XML, das geht viel einfacher.

Das oben ist auch nicht das fertige Ergebnis, das du dann einbauen kannst, das habe ich nur schnell und ungetestet hier rein geschrieben um kurz zu veranschaulichen, wie es sehr einfach geht, sowas via XML zu handhaben.

Ob das ganze Konstrukt auch so sinnvoll, bezweifle ich, es gibt bestimmt klügere Herangehensweisen, aber ich finde, um zu zeigen, wie man schnell und einfach via XML serialisieren kann, reicht das völlig aus.

Auch die Variante mit dem Dictionary in der Klasse Frage kannst du umbauen. Das habe ich deshalb gemacht, weil du so dann flexibel die Antwortmöglichkeiten einstellen kannst und zu jeder Antwort wird gleich noch der Buchstabe zugeordnet, den der Nutzer dann als Antwort angeben kann.

Soll heißen:
Schau dir das an, schau es durch, verstehe was da passiert und mach dir dann nochmal Gedanken, ob du das so nutzen kannst, oder wie du es am besten einsetzt.

Die XML-Datei ist dann vielleicht nicht unbedingt schön, weil du z.B. für das Dictionary noch so Dinger wie Key und Value drin stehen hast, oder andere Namen, wo du nicht wirklich weißt, was das sein soll, aber dafür ist es vom Code aus viel leichter zu handhaben und schnell implementiert.

Schau dir auch mal genau an, wie das Dictionary serialisierbar gemacht wurde. Ich halte das für eine weit angenehmere Art, spezifisch zu serialisieren, da so auch private Variablen einer Klasse beachtet werden können.

Gruß

PS:
Das Stichwort heißt Serialisierung. Das Wort habe ich vorher schon öffters benutzt:
Serialisierung

Such dann einfach nach c# Xml Serialisierung, da findest du bestimmt Einiges zum Thema.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.