LINQ pour lire le XML

J’ai ce fichier XML

           

Quelqu’un pourrait-il me donner un code C # en utilisant LINQ, le moyen le plus simple d’imprimer ce résultat:
(Notez l’espace supplémentaire s’il s’agit d’un nœud level2)

 A A1 A2 B B1 B2 C 

Actuellement j’ai ce code

 XDocument xdoc = XDocument.Load("data.xml")); var lv1s = from lv1 in xdoc.Descendants("level1") select lv1.Atsortingbute("name").Value; foreach (var lv1 in lv1s) { result.AppendLine(lv1); var lv2s = from lv2 in xdoc...??? } 

Essaye ça.

 void Main() { SsortingngBuilder result = new SsortingngBuilder(); //Load xml XDocument xdoc = XDocument.Load("data.xml"); //Run query var lv1s = from lv1 in xdoc.Descendants("level1") select new { Header = lv1.Atsortingbute("name").Value, Children = lv1.Descendants("level2") }; //Loop through results foreach (var lv1 in lv1s){ result.AppendLine(lv1.Header); foreach(var lv2 in lv1.Children) result.AppendLine(" " + lv2.Atsortingbute("name").Value); } Console.WriteLine(result); } 

Ou, si vous souhaitez une approche plus générale – par exemple pour imbriquer “levelN”:

 void Main() { XElement rootElement = XElement.Load(@"c:\events\test.xml"); Console.WriteLine(GetOutline(0, rootElement)); } private ssortingng GetOutline(int indentLevel, XElement element) { SsortingngBuilder result = new SsortingngBuilder(); if (element.Atsortingbute("name") != null) { result = result.AppendLine(new ssortingng(' ', indentLevel * 2) + element.Atsortingbute("name").Value); } foreach (XElement childElement in element.Elements()) { result.Append(GetOutline(indentLevel + 1, childElement)); } return result.ToSsortingng(); } 

Un couple de vieilles boucles foreach fournit une solution propre:

 foreach (XElement level1Element in XElement.Load("data.xml").Elements("level1")) { result.AppendLine(level1Element.Atsortingbute("name").Value); foreach (XElement level2Element in level1Element.Elements("level2")) { result.AppendLine(" " + level2Element.Atsortingbute("name").Value); } } 

Voici quelques exemples de travaux complets basés sur les exemples @bendewey et @dommer. J’ai eu besoin de tordre chacun d’eux pour le faire fonctionner, mais dans le cas où un autre noob LINQ cherche des exemples de travail, voici:

 //bendewey's example using data.xml from OP using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.Linq; class loadXMLToLINQ1 { static void Main( ) { //Load xml XDocument xdoc = XDocument.Load(@"c:\\data.xml"); //you'll have to edit your path //Run query var lv1s = from lv1 in xdoc.Descendants("level1") select new { Header = lv1.Atsortingbute("name").Value, Children = lv1.Descendants("level2") }; SsortingngBuilder result = new SsortingngBuilder(); //had to add this to make the result work //Loop through results foreach (var lv1 in lv1s) { result.AppendLine(" " + lv1.Header); foreach(var lv2 in lv1.Children) result.AppendLine(" " + lv2.Atsortingbute("name").Value); } Console.WriteLine(result.ToSsortingng()); //added this so you could see the output on the console } } 

Et ensuite:

 //Dommer's example, using data.xml from OP using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.Linq; class loadXMLToLINQ { static void Main( ) { XElement rootElement = XElement.Load(@"c:\\data.xml"); //you'll have to edit your path Console.WriteLine(GetOutline(0, rootElement)); } static private ssortingng GetOutline(int indentLevel, XElement element) { SsortingngBuilder result = new SsortingngBuilder(); if (element.Atsortingbute("name") != null) { result = result.AppendLine(new ssortingng(' ', indentLevel * 2) + element.Atsortingbute("name").Value); } foreach (XElement childElement in element.Elements()) { result.Append(GetOutline(indentLevel + 1, childElement)); } return result.ToSsortingng(); } } 

Celles-ci comstacknt et travaillent dans VS2010 en utilisant la version 4.0.30319.1 de csc.exe et donnent exactement le même résultat. J’espère que cela aidera quelqu’un d’autre qui cherche des exemples de code de travail.

EDIT: ajout de l’exemple de @eglasius également car il m’a été utile:

 //@eglasius example, still using data.xml from OP using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.Linq; class loadXMLToLINQ2 { static void Main( ) { SsortingngBuilder result = new SsortingngBuilder(); //needed for result below XDocument xdoc = XDocument.Load(@"c:\\deg\\data.xml"); //you'll have to edit your path var lv1s = xdoc.Root.Descendants("level1"); var lvs = lv1s.SelectMany(l=> new ssortingng[]{ l.Atsortingbute("name").Value } .Union( l.Descendants("level2") .Select(l2=>" " + l2.Atsortingbute("name").Value) ) ); foreach (var lv in lvs) { result.AppendLine(lv); } Console.WriteLine(result);//added this so you could see the result } } 
 XDocument xdoc = XDocument.Load("data.xml"); var lv1s = xdoc.Root.Descendants("level1"); var lvs = lv1s.SelectMany(l=> new ssortingng[]{ l.Atsortingbute("name").Value } .Union( l.Descendants("level2") .Select(l2=>" " + l2.Atsortingbute("name").Value) ) ); foreach (var lv in lvs) { result.AppendLine(lv); } 

Ps. Vous devez utiliser .Root sur l’une de ces versions.