Laden...

linq DataTable zu XML mit group

Erstellt von Cornflake vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.007 Views
C
Cornflake Themenstarter:in
142 Beiträge seit 2007
vor 9 Jahren
linq DataTable zu XML mit group

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?

C
Cornflake Themenstarter:in
142 Beiträge seit 2007
vor 9 Jahren

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