212 votes

LINQ to XML

J’ai obtenu ce fichier XML

Quelqu'un pourrait-il me donner un code c# à l’aide de LINQ, la façon la plus simple d’imprimer ce résultat :
(Notez l’espace supplémentaire si elle est un nœud de niveau 2)

Actuellement, j’ai obtenu ce code

237voto

bendewey Points 25437

Essayez ceci.

54voto

dommer Points 11550

Ou, si vous souhaitez une approche plus générale - c'est-à-dire pour la nidification jusqu'à « millieu » :

23voto

dommer Points 11550

Un couple de plain old for each boucles fournit une solution propre :

19voto

delliottg Points 791

Voici un couple de compléter exemples de travail qui s'appuient sur l' @bendewey & @dommer exemples. J'avais besoin de tweak chacun un peu pour le faire fonctionner, mais dans le cas où un autre LINQ noob est à la recherche d'exemples de travail, ici, vous allez:

//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.Attribute("name").Value,
               Children = lv1.Descendants("level2")
            };

        StringBuilder result = new StringBuilder(); //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.Attribute("name").Value);
        }
        Console.WriteLine(result.ToString()); //added this so you could see the output on the console
    }
}

Et suivant:

//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 string GetOutline(int indentLevel, XElement element)
    {
        StringBuilder result = new StringBuilder();
        if (element.Attribute("name") != null)
        {
            result = result.AppendLine(new string(' ', indentLevel * 2) + element.Attribute("name").Value);
        }
        foreach (XElement childElement in element.Elements())
        {
            result.Append(GetOutline(indentLevel + 1, childElement));
        }
        return result.ToString();
    }
}

Ces deux compiler et travailler dans VS2010 à l'aide de csc.exe version 4.0.30319.1 et de donner exactement la même sortie. Espérons que cela aide quelqu'un d'autre qui est à la recherche de travail exemples de code.

EDIT: ajout de @eglasius' exemple, car il est apparu utile de moi:

//@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( )
    {
        StringBuilder result = new StringBuilder(); //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 string[]{ l.Attribute("name").Value }
             .Union(
                 l.Descendants("level2")
                 .Select(l2=>"   " + l2.Attribute("name").Value)
              )
            );
        foreach (var lv in lvs)
        {
           result.AppendLine(lv);
        }
        Console.WriteLine(result);//added this so you could see the result
    }
}

7voto

eglasius Points 26221
<pre><code></code><p>PS. vous devez utiliser. Racine sur n’importe lequel de ces versions.</p></pre>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X