2010-12-06 37 views
1

Ce que j'ai est un XML que nous recevons d'un service web qui représente une liste de questions. Les questions sont ventilées par type qui indique comment elles doivent être affichées sur le web. Par exemple:Sélection d'une liste de sous-éléments en XML pouvant exister ou non

<step id="109025"> 
    <stepinf enabled="Yes" errors="0" id="First Name" mandatory="Yes" name="sti_115511" type="FIL"> 
    <field_label>First Name</field_label> 
    <screen_value></screen_value> 
    </stepinf> 
    <stepinf enabled="Yes" errors="0" id="Last Name" mandatory="Yes" name="sti_115513" type="FIL"> 
    <field_label>Last Name</field_label> 
    <screen_value></screen_value> 
    </stepinf> 
    <stepinf enabled="Yes" errors="0" id="State" mandatory="Yes" name="sti_109257" type="STE"> 
    <field_label>State</field_label> 
    <screen_value></screen_value> 
    <options_list> 
     <option label="AK">AK - Alaska</option> 
     <option label="AL">AL - Alabama</option> 
     <option label="AR">AR - Arkansas</option> 
     <option label="AS">AS - American Samoa (Terr.)</option> 
     <option label="AZ">AZ - Arizona</option> 
     ... 
    </options_list> 
    </stepinf> 
</step> 

Le type "STE" indique qu'il s'affichera sur le Web sous forme de zone de sélection.

Je peuplant une liste <> d'un type personnalisé que j'ai créé en procédant comme suit:

var stepinfList = (from stepinf in xdoc.Descendants("stepinf") 
    select new Question 
    { 
     TextID = stepinf.Attribute("id").Value, 
     Type = stepinf.Attribute("type").Value, 
     Name = stepinf.Attribute("name").Value, 
     Label = stepinf.Element("field_label").Value, 
     Required = stepinf.Attribute("mandatory").Value, 
     ErrorCount = int.Parse(stepinf.Attribute("errors").Value) 
    }).ToList(); 

Là où je suis se perdre à est que je ne sais pas comment obtenir les sous-éléments d'option dans mon résultats. J'ai essayé de créer une propriété dans le type Question nommé Options que j'ai défini comme un IDictionary et puis utilisé un sous-select dans ma requête LINQ et l'extension ToDictionary. Cela n'a pas fonctionné car je pense qu'il bombarde les enregistrements stepinf qui n'ont pas d'éléments option_list enfants. Quoi qu'il en soit, je reçois "Référence d'objet non définie sur une instance d'un objet" sur l'instruction LINQ lorsque j'exécute la page. Je crains que ce soit au-dessus de mon ensemble actuel de compétences LINQ, donc toute aide serait grandement appréciée.

Répondre

0

Cela n'a pas fonctionné comme je le pense bombes sur les dossiers de stepinf qui ne sont pas ont des éléments enfant de option_list.

Votre évaluation est correcte, vous devez donc vérifier s'il existe option_list avant de l'interroger. Vérifiez si c'est null et renvoyez le dictionnaire ou renvoyez null en conséquence.

Essayez ceci:

Options = stepinf.Element("options_list") == null ? null : 
       stepinf.Element("options_list").Elements("option") 
        .ToDictionary(x => x.Attribute("label").Value, x => x.Value) 
+0

Merci beaucoup Ahmad. Je pensais que je devrais vérifier null, mais je ne savais pas comment. Votre solution a fonctionné comme un charme. –