2012-05-30 3 views
1

Je cherche à obtenir une liste de sélection à partir d'une chaîne XML ...XML à SelectList LINQ

<?xml version="1.0" encoding="utf-8"?> 
<selectListItemDefinition id="UPMCTypes"> 
    <item key="bla1" value="bla" /> 
    <item key="bla2" value="bla" /> 
    <item key="bla3" value="bla" /> 
    <item key="bla4" value="bla" /> 
    <item key="bla5" value="bla" /> 
    <item key="bla6" value="bla" /> 
    <item key="bla7" value="bla" /> 
    <item key="bla8" value="bla" /> 
    <item key="bla9" value="bla" /> 
    <item key="bla10" value="bla" /> 
    <item key="bla11" value="bla" /> 
</selectListItemDefinition> 

Ce serait la chaîne XML que je suis en train de se transformer en une SelectList Voici comment je J'essaie de le faire ...

List<SelectListItem> SListItem = 
(
    from xmlSList in xDoc.Descendants("selectListItemDefinition") 
    let listItem = xmlSList.Elements("item") 
    select new SelectListItem 
    { 
     Key = xmlSList.Attribute("key").Value, 
     Value = xmlSList.Attribute("value").Value 
    } 
).ToList(); 

Ceci me donne seulement la première valeur-clé.

Key "blah1" string 
Value "blah" string 

Maintenant je pense que c'est parce que je reçois seulement un élément ici? Mais je ne suis pas sûr de ce que je ferais pour bien faire les choses.

Répondre

4

Je pense que vous avez un problème dans votre requête, car vous devriez obtenir une exception.

Vous essayez de sélectionner les attributs "clé" et "valeur" de <selectListItemDefinition>, mais ils n'existent pas. Et vous n'utilisez pas réellement listItem dans votre clause select.

Votre première ligne renvoie un IEnumerable<XElement> de tous les nœuds appelés "selectListItemDefinition". Votre deuxième ligne prend juste cela IEnumerable<> et en assignant les éléments de l'enfant appelés "item" à la variable nommée listItem.

Lorsque vous devriez faire est une deuxième requête pour itérer sur les éléments <selectListItemDefinition> au lieu de l'assigner. Remplacez let listItem = xmlSList.Elements("item") par from listItem in xmlSList.Elements("item") et il devrait se comporter comme prévu.

la requête complète serait:

var SListItem = 
       (
        from xmlSList in xDoc.Descendants("selectListItemDefinition") 
        from listItem in xmlSList.Elements("item") 
        select new SelectListItem 
        { 
         Key = listItem .Attribute("key").Value, 
         Value = listItem .Attribute("value").Value 
        } 
       ).ToList(); 

Et si vous êtes certain à 100% que les seuls éléments appelés <item> dans votre document XML sont celles que vous voulez, vous pouvez remplacer les première et deuxième lignes avec un seul from listItem in xDoc.Descendants("item") et vous obtiendrez le même comportement.

+0

Merci. J'ai fini par faire quelque chose de similaire. Ce linq à xml est un vrai ours. – SoftwareSavant