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-
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
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 !
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
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 😦
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