Laden...

Probleme bei XML Datei in DataTable lesen

Erstellt von markuss21 vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.428 Views
M
markuss21 Themenstarter:in
121 Beiträge seit 2006
vor 16 Jahren
Probleme bei XML Datei in DataTable lesen

Hi,
ich möchte eine beliebige XML-Datei in eine Datatable laden, welche als Datenquelle für ein DataGridView dient.

Mein bisheriger Source-Code lautet wie folgt:


  public void DateiLesen(String Dateiname)
        {
            if (File.Exists(Dateiname))
            {
                //Reader für Elemente
                XmlTextReader xmlr = new XmlTextReader(Dateiname);
                //Reader für Werte
                XmlTextReader xmlrWerte = new XmlTextReader(Dateiname);

                //Alle Elemente als Zeilen erfassen, damit sie später zu Spalten werden
                DataTable dtSpalten = new DataTable("dtSpalten");
                DataTable dtXML = new DataTable("dtXML");

                //Datatables reinigen
                dtXML.Rows.Clear();
                dtXML.Columns.Clear();
                dtSpalten.Rows.Clear();
                dtSpalten.Columns.Clear();

                dtSpalten.Columns.Add("SpaltenAusXML");

                //Alle Elemente lesen und Zeilen schreiben
                while (xmlr.Read())
                {
                    if (xmlr.NodeType == XmlNodeType.Element)
                    {
                        DataRow rw = dtSpalten.NewRow();              
                        rw[0] = xmlr.Name.ToString();                      
                         dtSpalten.Rows.Add(rw);                                           
                    }
                }
                xmlr.Close();

                foreach (DataRow row in dtSpalten.Rows)
                {
                    //Spalten erzeugen, wenn Exception dann weiter, da Spaltennamen doppelt vorkommen.
                    try
                    {
                        dtXML.Columns.Add(row[0].ToString());
                    }
                    catch (Exception exx)
                    { 
                    }
                }

                //Einlesen der Werte für die Elemente
                while (xmlrWerte.Read())
                {

                    if (xmlrWerte.NodeType== XmlNodeType.Element)
                    {

                        DataRow r = dtXML.NewRow();
                        r[xmlrWerte.Name.ToString()] = xmlrWerte.ReadString().ToString();
                        dtXML.Rows.Add(r);
                    }
                }
                dataGridView1.DataSource = dtXML;
            }
        }

Problem hier ist, dass für alle Elemente eine Zeile geschrieben wird. Das ist bei gleichen Elemente ein Problem.
Wäre über Vorschläge sehr dankbar !

-Markus-

V
327 Beiträge seit 2005
vor 16 Jahren

hallo,

du kannst doch mit DataTable.ReadXml(dateiname) Daten aus einer XML Datei in eine Table lesen.
Mußt nur vorher dafür sorgen, dass du alle Spalten hast, die du brauchst, die kannst ja aus der Datei auslesen...
die Table bindest du dann an das GridView.

Schreiben kannst du die XML Datei dann wieder mit WriteXml

MFG Veasel

M
markuss21 Themenstarter:in
121 Beiträge seit 2006
vor 16 Jahren
Werte werden nicht geladen !

Hi, danke schonmal.

Habe den Code jetzt so geändert:

 public void DateiLesen(String Dateiname)
        {
            if (File.Exists(Dateiname))
            {
                //Reader für Elemente
                XmlTextReader xmlr = new XmlTextReader(Dateiname);
                //Reader für Werte
                XmlTextReader xmlrWerte = new XmlTextReader(Dateiname);

                //Alle Elemente als Zeilen erfassen, damit sie später zu Spalten werden
                DataTable dtSpalten = new DataTable("dtSpalten");
                DataTable dtXML = new DataTable("");

                //Datatables reinigen
                dtXML.Rows.Clear();
                dtXML.Columns.Clear();
                dtSpalten.Rows.Clear();
                dtSpalten.Columns.Clear();

                dtSpalten.Columns.Add("SpaltenAusXML");

                //Alle Elemente lesen und Zeilen schreiben
                while (xmlr.Read())
                {
                    if (xmlr.NodeType == XmlNodeType.Element)
                    {
                        DataRow rw = dtSpalten.NewRow();              
                        rw[0] = xmlr.Name.ToString();                      
                         dtSpalten.Rows.Add(rw);                                           
                    }
                }
                xmlr.Close();

                foreach (DataRow row in dtSpalten.Rows)
                {
                    //Spalten erzeugen, wenn Exception dann weiter, da Spaltennamen doppelt vorkommen.
                    try
                    {
                        dtXML.Columns.Add(row[0].ToString());
                    }
                    catch (Exception exx)
                    {
                    }
                }

 
                dtXML.ReadXml(Dateiname);

                ////Einlesen der Werte für die Elemente
                //while (xmlrWerte.Read())
                //{

                //    if (xmlrWerte.NodeType== XmlNodeType.Element)
                //    {

                //        DataRow r = dtXML.NewRow();
                //        r[xmlrWerte.Name.ToString()] = xmlrWerte.ReadString().ToString();
                //        dtXML.Rows.Add(r);
                //    }
                //}
                dataGridView1.DataSource = dtXML;

Leider befinden sich keine Zeilen in der Datatable. Weiss jemand noch rat ?

Danke schonmal !

V
327 Beiträge seit 2005
vor 16 Jahren

Hallo,

ich denke das Problem ist, dass du den Tabellennamen für dtXML leer lässt.
der muss aber so heißten wie die Tabelle, die die XML Datei repräsentiert, heißt, sonst weis XmlRead() ja nicht wo es die Werte eintragen soll.

Aufbau XML-Datei...

<Doc>
  <Tabelle>
    <Spalte1>WerteZeile1</Spalte1>
    <Spalte2>WerteZeile1</Spalte2>
  </Tabelle>
  <Tabelle>
    <Spalte1>WerteZeile2</Spalte1>
    <Spalte2>WerteZeile2</Spalte2>
  </Tabelle>
</Doc>

Du müsstest quasi den Tabellennamen auslesen und und die DataTable so benennen und dann sollte das funzen...
jedenfalls funzt es dann bei mir... 😮)

Poste sonst mal nen Ausschnitt aus deiner XML-Datei, dann kann ich das damit mal testen...

Grüße

MFG Veasel

M
markuss21 Themenstarter:in
121 Beiträge seit 2006
vor 16 Jahren
HTML Datei

Meine Beispieldatei ist sehr einfach aufgebaut:


<Stammknoten>
  <Position>Position A</Position>
  <Artikelname>Artikel 1</Artikelname>
  </Stammknoten>

Die Datatable nenne ich dann "Stammknoten".

Leider funktioniert es dann immer noch nicht 😦

V
327 Beiträge seit 2005
vor 16 Jahren

hallo,
als erstes solltes du vor deinem

while (xmlr.Read())
{...}

ein

xmlr.ReadStartElement();

setzen, damit du erst nach dem Stammknoten anfängst mit dem Lesen.
Dann fehlt in deinem Aufbau der XML meiner Meinung nach eine Ebene, nämlich die der Tabelle.
Du hast da jetzt 2 Spalten drin, aber ReadXML weis nicht zu welcher Tabelle die gehören.

<Stammknoten>
<TabellenName>  
<Position>Position A</Position>
<Artikelname>Artikel 1</Artikelname>
</TabellenName>
</Stammknoten>

So gehts...
dann musst du nur dafür sorgen, dass beim Einlesen deiner Spalten auch nur die Spalten gelesen werden und nichts anderes... Der TabellenName ist auch von NodeType.Element.

nee idee, vielleicht nicht die schönste...
bei deinem Einlesen der Spalten auch auf den Namen prüfen.

//dtXML.TableName = xmlr.ReadString(); 
if (xmlr.NodeType == XmlNodeType.Element && xmlr.Name != dtXML.TableName)
{
	DataRow rw = dtSpalten.NewRow();
	rw[0] = xmlr.Name.ToString();
	dtSpalten.Rows.Add(rw);
}

ODER wenn du die Möglichkeit hast die XML Datei über dein Programm zu schreiben, dann mach das mit WriteXML und schreib das Schema mit weg.

dt.WriteXml(fileName, XmlWriteMode.WriteSchema);

Dann brauchst du dich um gar nichts kümmern, nur ReadXML aufrufen.
In der MSDN findest du ein gutes Beispiel dazu.

MFG Veasel