Autor Beitrag
rene87
Hält's aus hier
Beiträge: 2

Win XP, Win Vista
VS 2008
BeitragVerfasst: Mo 06.10.08 16:28 
Guten Tag bei meinen ersten komplexeren Programm benutzte ich eine XML Datei die so aufgebaut ist
ausblenden 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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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:
ausblenden 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
ausblenden 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>

    <!--  
    UniqueConstraints  
    -->

    <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:
ausblenden C#-Quelltext
1:
2:
3:
Fragen = new DataSet();
Fragen.LoadXmlSchema(schemaname);  //  Pfad zur xsd-Datei
Fragen.LoadXml(filename);   //  Pfad zur xml-Datei


Wenn das Vorgehen nicht klar ist: einfach nachfragen! Jürgen


Zuletzt bearbeitet von JüTho am Mo 06.10.08 19:44, insgesamt 1-mal bearbeitet
rene87 Threadstarter
Hält's aus hier
Beiträge: 2

Win XP, Win Vista
VS 2008
BeitragVerfasst: Mo 06.10.08 18:36 
wenn ich jetzt denn code zu
ausblenden 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");
            //gesuchterText=
        }
ab ändere bekomme ich folgende Fehlermeldung beim aus führen
ausblenden 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
ausblenden XML-Daten
1:
2:
3:
...  
<Frage ID="2" Name="Menschen"/>
...
definiert habe und gesuchterText gleich Mensch sein soll;
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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:
ausblenden 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# 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