2010-09-10 5 views
2

J'ai une liste de chaînesLecture du fichier Xml en utilisant LINQ en C#

 List<String> lst=new List<String>{"A","B","C"} 

Et un fichier xml comme

<Root> 
<ChildList> 
    <Childs> 
     <Child Name="a1" Val="A"/> 
     <Child Name="a2" val="A"/> 
     <Child Name="b1" val="B"/> 
    </Childs> 
</ChildList> 
</Root> 

je dois lire contets du fichier xml et ajouter à un dictionnaire

Dictionary<String,List<String>> dict 

où la clé est le dictionnaire des éléments de la « LST » et la valeur est la valeur d'attribut de « Nom » du fichier

Ainsi, le résultat sera de

Key(String)   Value(List<String>) 

    "A"       "a1","a2" 
    "B"       "b1" 
    "C"       null 

maintenant je suis en utilisant imbriquée boucle pour cette

Y at-il Wau de le faire en utilisant LINQ to XML

Merci à l'avance

+0

Donnez-nous votre XML :) @ –

Répondre

3

Je pense que cela va le faire:

XDocument doc = XDocument.Load("foo.xml"); 
ILookup<string, string> lookup = doc.Descendants("Childs") 
            .First() 
            .Elements("Child") 
            .ToLookup(x => (string) x.Attribute("Val"), 
               x => (string) x.Attribute("Name")); 

var dictionary = lst.ToDictionary(x => x, 
         x => lookup[x].ToList().NullIfEmpty()); 

En utilisant une méthode d'assistance:

public static List<T> NullIfEmpty<T>(this List<T> list) 
{ 
    return list.Count == 0 ? null : list; 
} 

Si vous ne me dérange pas d'avoir une liste vide au lieu de null des articles qui ne sont pas le fichier XML, la deuxième déclaration peut être simplifiée, sans avoir besoin de la méthode d'assistance:

var dictionary = lst.ToDictionary(x => x, x => lookup[x].ToList()); 

Notez que je l'ai structuré de façon à ce qu'il ne doive parcourir qu'une seule fois le fichier XML, au lieu de chercher une fois dans le fichier pour chaque élément de la liste.

+0

+1 solution de Nice ... –

+0

@ Jon Skeet: Merci –

+0

Skeet @ Jon, je pense que le ToDictionary devrait être 'var dictionnaire = lookup.ToDictionary (x => x.Key, x => recherche [x.Key] .ToList()); '. –

1
var xml = @"<Root> 
<ChildList> 
    <Childs> 
     <Child Name=""a1"" Val=""A""/> 
     <Child Name=""a2"" Val=""A""/> 
     <Child Name=""b1"" Val=""B""/> 
    </Childs> 
</ChildList> 
</Root>"; 

var lst= new List<String> { "A", "B", "C" }; 
var doc = XDocument.Parse(xml); 

var dict = (from item in lst 
      select new 
      { 
       Key = item, 
       Value = (from elem in doc.Root.Element("ChildList").Element("Childs").Elements("Child") 
         where (string)elem.Attribute("Val") == item 
         select (string)elem.Attribute("Name")).ToList() 
      }).ToDictionary(i => i.Key, i => i.Value); 

Ceci peut être rendu plus efficace. Je parcourir sur les éléments une fois pour chaque élément dans lst. Je proposerai une autre solution plus tard si les autres n'en proposent pas une.

+0

lasseespeholt: Merci –

Questions connexes