rene87 - Mo 06.10.08 16:28
Titel: XML Datei im Porjekt auswerten
Guten Tag bei meinen ersten komplexeren Programm benutzte ich eine XML Datei die so aufgebaut ist
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| <?xml version="1.0" encoding="utf-8" ?>
<Fragen> <Frage ID="1" > <Wort Name="..."/> </Frage> <Frage ID="2"> <Wort Name="..."/> </Frage> ... </Fragen> |
im Programm selber hab ich eine Funktion geschrieben die zuerst eine Zufallszahl ermittelt und anschließend soll die ID in der XML Datei gefunden werden und das Wort in einer String Variable gespeichert werden.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| private void wortsuche() {
int zufallsZahl; Random ran = new Random(); zufallsZahl = ran.Next(1, (Properties.Settings.Default.maxID) + 1); Fragen = new XmlDocument(); Fragen.Load("Fragen.xml"); } |
Die Funktion ist nicht fertig weil ich einfach nicht weis wie ich weiter vorgehen muss.
JüTho - Mo 06.10.08 17:32
Hallo,
in einem solchen Fall würde ich über
DataTable mit
ReadXml/WriteXml sowie ggf.
ReadXmlSchema/WriteXmlSchema gehen. Die xml-Datei würde dann so aussehen:
XML-Daten
1: 2: 3: 4:
| <Fragen> <Frage ID="1" Name="..." Wert="..." /> ... </Fragen> |
Das bedeutet: Das DataSet heißt Fragen, die DataTable heißt Frage, die DataColumns sind ID, Name, Wert (oder wie auch immer).
Das xsd-Schema sieht etwa so aus:
Achtung; Fehler in diesem Schema - siehe Korrektur in meinem nächsten Beitrag. JüTho
XML-Daten
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| <?xml version="1.0" standalone="yes"?> <xs:schema id="ConfigDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element name="Fragen" msdata:IsDataSet="true" msdata:Locale="de-DE" msdata:EnforceConstraints="False"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Frage"> <xs:complexType> <xs:sequence> <xs:element name="ID" type="xs:int" /> <xs:element name="Name" type="xs:string" /> <xs:element name="Wert" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType>
<xs:unique name="FragePK" msdata:PrimaryKey="true"> <xs:selector xpath=".//Frage" /> <xs:field xpath="@ID" /> </xs:unique> </xs:element> </xs:schema> |
Damit reduziert sich das Vorgehen auf:
C#-Quelltext
1: 2: 3:
| Fragen = new DataSet(); Fragen.LoadXmlSchema(schemaname); Fragen.LoadXml(filename); |
Wenn das Vorgehen nicht klar ist: einfach nachfragen! Jürgen
rene87 - Mo 06.10.08 18:36
wenn ich jetzt denn code zu
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| private string gesuchterText; private void wortsuche() { DataSet Fragen; int zufallsZahl; Random ran = new Random(); zufallsZahl = ran.Next(1, (Properties.Settings.Default.maxID) + 1); Fragen = new DataSet(); Fragen.ReadXmlSchema("XMLs\\Fragenschema.xml"); Fragen.ReadXml("XMLs\\Fragen.xml"); } |
ab ändere bekomme ich folgende Fehlermeldung beim aus führen
Quelltext
1:
| Ungültige XPath-Auswahl im Feldknoten. @ID kann nicht gefunden werden |
LoadXmlSchema(schemaname);
LoadXml(filename);
sind bei mir nicht vorhanden bei using system.xml
wie muss gesuchter Text weiter gehen wenn ich in der XML Datei
XML-Daten
1: 2: 3:
| ... <Frage ID="2" Name="Menschen"/> ... |
definiert habe und gesuchterText gleich Mensch sein soll;
JüTho - Mo 06.10.08 19:37
Hallo Rene,
DataSet und DataTable befinden sich im
System.Data-Namespace.
So eine Information findet man immer in der SDK-Doku/MSDN.
schemaname und filename sind
Variablennamen mit den korrekten Strings für die beiden Dateien.
Die Schemadatei sollte die Extension xsd haben.
Beide Dateien müssen eine korrekte xml-Struktur haben; ich habe darauf verzichtet, vollständige Dateien zu kopieren. Bei der Fehlermeldung mit "@ID" habe ich einen Fehler gemacht; die Tabelle in der Schema-Datei muss so deklariert werden:
XML-Daten
1: 2: 3: 4: 5: 6: 7:
| <xs:element name="Frage"> <xs:complexType> <xs:attribute name="ID" type="xs:int" /> <xs:attribute name="Name" type="xs:string" /> <xs:attribute name="Wert" type="xs:string" /> </xs:complexType> </xs:element> |
Erklärung: Felder, die als xs:element deklariert werden, werden in der xml-Datei als eigenes Element eingetragen; Felder, die als xs:attribute deklariert werden, stehen in einer Datenzeile. Ein Element wird bei UniqueConstraints ohne '@', ein Attribut mit '@' angegeben.
Ich schlage vor, dass Du per Code (oder per IDE) eine
DataTable erzeugst mit den benötigten Feldern und diese Struktur mit
WriteXmlSchema abspeicherst; dann siehst Du genau, wie sie aussehen soll. Das habe ich mit meinem Hinweis "nachfragen" gemeint. Du kannst nicht erwarten, dass Du vollständigen Code bekommst, sondern musst Dich mit den dazu gehörenden Techniken ernsthaft befassen.
Falls nötig, solltest Du eine Einführung in die DB-Verarbeitung unter NET z.B. in
OpenBook Visual C# [
http://www.galileocomputing.de/openbook/visual_csharp/] Kap.25 ff. durcharbeiten.
Übrigens ist es äußerst ungünstig, bei jeder neuen Wortsuche das DataSet zu erzeugen und neu einzulesen. Das gehört z.B. in das FormLoad-Ereignis. In der Methode wortsuche wird dann darauf zugegriffen. Gleiches gilt für die Zufallszahl:
Random() wird einmal erzeugt und dann für jede neue Zufallszahl mit
Next aufgerufen.
Für die Suche eines speziellen Datensatzes steht übrigens die Methode
DataTable.Rows.Find() zur Verfügung.
Jürgen