2017-03-06 5 views
1

Ich habe die folgende AussageC# Liste innerhalb Liste XML Linq

xdoc.Descendants("Father").Select(p => new 
    { 
     Son1 = (string)p.Element("Son1").Value, 
     Son2 = (string)p.Element("Son2").Value, 
     Son3= (string)p.Element("Son3").Value, 
     Son4 = (string)p.Element("Son4").Value, 
     Son5 = (string)p.Element("Son5").Value 

    }).ToList().ForEach(p => 
    { 

     Response.Write("Son1= " + p.Son1 + " "); 
     Response.Write("Son2=" + p.Son2 + " "); 
     Response.Write("Son3=" + p.Son3 + " "); 
     Response.Write(("Son4 =") + p.Son4 + " "); 
     Response.Write(("Son5 =") + p.Son5 + " "); 
     Response.Write("<br />"); 
    }); 

und es in Ordnung, so lange funktioniert, wie ich nur eine Instanz jedes Sohn haben, ist das Problem, dass ich mehrere Instanzen von Son5 haben, und i weiß nicht, wie Son5 zu setzen innerhalb einer Liste

Hier ist meine XML-Code Beispiel:

enter image description here

Antwort

4

Wenn Sie mehrere Elemente der gleichen Art haben, dann yo u sollte analysieren, um diese aufzulisten oder andere Sammlung:

var fathers = from f in xdoc.Descendants("Father") 
       select new { 
       Son1 = (string)f.Element("Son1"), 
       Son2 = (string)f.Element("Son2"), 
       Son3= (string)f.Element("Son3"), 
       Son4 = (string)f.Element("Son4"), 
       Son5 = f.Elements("Son5").Select(s5 => (string)s5).ToList() 
      }; 

Einige Anmerkungen:

  • nicht .Value von XElement oder XAttribute Verwenden Sie - Sie seinen Wert Element selbst zu entsprechenden Datentyp ohne Zugriff werfen können. Vorteile - weniger Code, zuverlässiger, falls Element fehlt (Sie werden nicht Nullreferenceexception bekommen)
  • Betrachten int oder int? als elemenent Werte zu verwenden, wenn die Elemente ganzzahlige Werte
  • enthalten Wenn Sie einzelne Father Element, dann don‘haben t Arbeit mit der Sammlung von Vätern. Holen Sie sich einfach xml root und prüfen Sie, ob es null ist oder nicht. Danach können Sie ein einzelnes father Objekt erstellen.

Schreiben Antwort

foreach(var father in fathers) 
{ 
    Response.Write($"Son1={father.Son1} "); 
    Response.Write($"Son2={father.Son2} "); 
    Response.Write($"Son3={father.Son3} "); 
    Response.Write($"Son4={father.Son4} ");  
    Response.Write(String.Join(" ", father.Son5.Select(son5 => $"Son5={son5}"));  
    Response.Write("<br />"); 
} 
+1

danke für Ihre Tipps –

+0

@EvgenySdvizhkov auch beachten Sie, dass Sie in der Regel nicht Zeichenfolgen direkt auf die Antwort schreiben sollten. Erwägen Sie, eine Ansicht für Ihre Aktion zu erstellen, und verwenden Sie die Rasierersyntax, um Vaterdaten anzuzeigen. –

1

Try this:

xdoc.Descendants("Father").Select(p => new 
{ 
    Son1 = p.Element("Son1").Value, 
    Son2 = p.Element("Son2").Value, 
    Son3= p.Element("Son3").Value, 
    Son4 = p.Element("Son4").Value, 
    Sons5 = p.Elements("Son5").Select(element => element.Value).ToList() 

}).ToList().ForEach(p => 
{ 

    Response.Write("Son1= " + p.Son1 + " "); 
    Response.Write("Son2=" + p.Son2 + " "); 
    Response.Write("Son3=" + p.Son3 + " "); 
    Response.Write("Son4 =" + p.Son4 + " "); 
    p.Sons5.ForEach(son5 => Response.Write("Son5 =" + son5 + " ")); 
    Response.Write("<br />"); 
}); 

, das eine Liste von Son5 in der Liste der Elemente schaffen, die Sie in den ForEach mit einer anderen ForEach laufen können.

+0

Es wird ein Fehler beim Konvertieren der Liste in (string) –

+0

@SergeyBerezovskiy: Der Beitrag wurde korrigiert. Eigentlich ist keiner der Casts notwendig – Sefe

+0

das war sehr hilfreich danke –

Verwandte Themen