2010-11-29 6 views
5

Compte tenu de cette structure:Comment vérifier si XML contient un élément lors de l'utilisation de LINQ to XML?

<root> 
    <user> 
      <userName>user1</userName> 
      <userImageLocation>/user1.png</userImageLocation> 
    </user> 
    <user> 
      <userName>user2</userName> 
    </user> 
</root> 

public class User 
{ 
    public string UserName {get; set; } 
    public string UserImageLocation {get; set; } 
} 

J'utilise LINQ to XML pour obtenir des données à partir du fichier XML, comme ceci:

XDocument document = XDocument.Parse(xmlFile); 
List<User> listOfUsers = 
(from user in document.Descendants("user") 
select new User { 
    UserName = user.Element("userName"), 
    UserImageLocation = user.Element("userImageLocation"), 
} 
).ToList<User>(); 

Mon problème est que tous les éléments de l'utilisateur contient un userImageLocation et lorsque vous essayez de lire le userImageLocation, il déclenche une exception.

Comment puis-je vérifier si un élément XML existe et s'il existe, le lire?

Répondre

7

Votre code actuel ne sera pas compilé, car vous essayez d'affecter un XElement à une propriété de chaîne. Ma conjecture est que vous utilisez la propriété XElement.Value pour le convertir en une chaîne. Au lieu de cela, utilisez la conversion de chaîne explicite, qui retournera null si vous l'appelez « sur » une référence XElement null:

XDocument document = XDocument.Parse(xmlFile); 
List<User> listOfUsers = 
(from user in document.Descendants("user") 
select new User { 
    UserName = (string) user.Element("userName"), 
    UserImageLocation = (string) user.Element("userImageLocation"), 
} 
).ToList<User>(); 

Notez que c'est l'une de ces situations est un peu plus lisible en utilisant la notation par points:

XDocument document = XDocument.Parse(xmlFile); 
List<User> listOfUsers = document 
    .Descendants("user") 
    .Select(user => new User { 
     UserName = (string) user.Element("userName"), 
     UserImageLocation = (string) user.Element("userImageLocation") }) 
    .ToList(); 
3

essayer ci-dessous le code

UserImageLocation = user.Element("userImageLocation")!=null?user.Element("userImageLocation").Value:string.Empty