Hallo
Mein Ziel ist es aus einer DataTable eine XML zu erstellen.
Dazu muss die DataTable in zwei Schritten gruppiert werden. Einmal über die Strassen und darunter über die Häuser.
Ich habe eine DataTable mit folgendem Aufbau:
Datum ; Ort ; Strasse ; Haus ; Anzahl
010114 ; A ; AA ; AAA ; 1
010114 ; A ; AA ; BBB ; 2
010114 ; A ; AA ; CCC ; 3
010114 ; A ; BB ; AAA ; 1
010114 ; A ; BB ; BBB ; 5
010114 ; A ; CC ; AAA ; 2
Daraus soll folgende XML entstehen:
<root>
<info1>test1</info1>
<Strassen>
<Strasse>
<Ort>A</Ort>
<Strassename>AA</Strassename>
<Haeuser>
<Haus>
<Hausname>AAA</Hausname>
<Anzahl>1</Anzahl>
<Datum>010114</Datum>
</Haus>
<Haus>
<Hausname>BBB</Hausname>
<Anzahl>2</Anzahl>
<Datum>010114</Datum>
</Haus>
<Haus>
<Hausname>CCC</Hausname>
<Anzahl>3</Anzahl>
<Datum>010114</Datum>
</Haus>
</Haeuser>
</Strasse>
<Strasse>
<Ort>A</Ort>
<Strassename>BB</Strassename>
<Haeuser>
<Haus>
<Hausname>AAA</Hausname>
<Anzahl>1</Anzahl>
<Datum>010114</Datum>
</Haus>
<Haus>
<Hausname>BBB</Hausname>
<Anzahl>5</Anzahl>
<Datum>010114</Datum>
</Haus>
</Haeuser>
</Strasse>
<Strasse>
<Ort>A</Ort>
<Strassename>CC</Strassename>
<Haeuser>
<Haus>
<Hausname>AAA</Hausname>
<Anzahl>2</Anzahl>
<Datum>010114</Datum>
</Haus>
</Haeuser>
</Strasse>
</Strassen>
</root>
Mit Linq habe ich bisher folgendes Versucht, aber leider noch keine passende Lösung hinbekommen. Durch das doppelte gruppieren klappt es einfach nicht.
XStreamingElement xmlTree = new XStreamingElement("Root",
new XElement("info1", "test1"),
new XStreamingElement("Strassen",
from line in DtDaten.AsEnumerable()
group line by new
{
Ort = line.Field<string>("Ort"),
Strasse = line.Field<string>("Strassen")
} into g
select new
{
new XStreamingElement("Strasse",
new XElement("Ort", Ort),
new XElement("Strassenname", Strasse),
new XElement("Haeuser",
{
Strasse = g.Key,
Items = from i in g
group i by new
{
Haus = i.Field<string>("Haus")
} into d
select new
{
new XElement("Hausname", d.Field<string>("Haus")),
new XElement("Anzahl", d.Field<string>("Anzahl")),
new XElement("Datum", d.Field<string>("Datum")),
}
}
}));
Hat jemand dazu eine Lösung?
Habe es selber gelöst. 😃
Für alle die auch mal vor diesem Problem stehen:
...
new XStreamingElement("Strassen",
(
from line in DtDaten.AsEnumerable() //hier beginnt die Abfrage der DataTable
group line by new // Hier beginnt die erste Gruppierung
{
Ort = line.Field<string>("Ort"),
Strasse = line.Field<string>("Strasse")
}
).Select((g, i) => //Hier wird die Ausgabe der ersten Abfrage aufgebaut
new XStreamingElement("Strasse",
new XElement("Ort", g.Key.Ort),
new XElement("Strassenname", g.Key.Strasse),
new XElement("Haeuser",
(
from line2 in g //Hier beginnt die Unterabfrage der ersten Abfrage
group line2 by new // Hier beginnt die Untergruppierung
{
Ort = line.Field<string>("Ort"),
Strasse = line.Field<string>("Strasse"),
Haus = line.Field<string>("Haus")
}
).Select((g2, i2) => //Hier wird die Ausgabe der Untergruppierung aufgebaut
new XElement("Hausname", g2.Select(c => (string)c.Field<string>("Haus")),
new XElement("Anzahl", g2.Select(c => (int)c.Field<int>("Anzahl")),
new XElement("Datum", g2.Select(c => (string)c.Field<string>("Datum"))
))))));
Grüße Cornflake