2010-01-28 2 views
2

J'essaie d'obtenir des informations de rôle, mais le premier nœud n'a pas d'élément "projectRoleType". Je souhaite passer par-dessus celui-ci et saisir uniquement ceux qui ont un "projectRoleType" et "categoryId". Chaque fois que j'essaie de vérifier, j'obtiens toujours l'erreur: La référence d'objet n'est pas définie sur une instance d'un objet. Qu'est-ce que je ne fais pas?Erreur LINQ to XML: La référence d'objet n'est pas définie sur une instance d'un objet

var _role = from r1 in loaded.Descendants("result") 
         let catid = (string)r1.Element("projectRoles").Element("projectRoleType").Element("categoryId") 
         where catid != null && catid == categoryId 
         select new 
         { 
          id = (string)r1.Element("projectRoles").Element("projectRoleType").Element("id"), 
          name = (string)r1.Element("fullName"), 
          contactId = (string)r1.Element("contactId"), 
          role_nm = (string)r1.Element("projectRoles").Element("projectRoleType").Element("name") 
         }; 
      foreach (var r in _role) 
      { 
       fields.Add(new IAProjectField(r.id, r.role_nm, r.name, r.contactId)); 
      } 

Répondre

4

vous obtenez un NullReferenceException si vous essayez d'accéder au membre ou invoquer une méthode de null. Par exemple, r1.Element("projectRoles").Element("projectRoleType") retours null s'il n'y a pas projectRoleType élément dans projectRoles, obtenant ainsi l'enfant categoryId de null lève une exception.

Ajouter un chèque nul:

from r1 in loaded.Descendants("result") 

let projectRoleType = r1.Element("projectRoles").Element("projectRoleType") 
where projectRoleType != null 

let catid = (string)projectRoleType.Element("categoryId") 
where catid == categoryId 

select ... 
Questions connexes