2010-11-29 21 views
5

Dada esta estructura:¿Cómo comprobar si XML contiene elementos cuando se usa 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; } 
} 

utilizo el LINQ to XML para obtener datos del archivo XML, así:

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>(); 

Mi problema es que no todo el elemento de usuario contiene una userImageLocation, y cuando intenta leer el userImageLocation, arroja una excepción.

¿Cómo puedo verificar si existe un elemento XML y, si existe, leerlo?

Respuesta

7

Su código actual no se compilará, ya que está tratando de asignar un XElement a una propiedad de cadena. Supongo que está usando la propiedad XElement.Value para convertirla en una cadena. En lugar de eso, utilice la conversión de cadenas explícita, que devolverá un valor nulo si lo llamas "en" un nulo XElement referencia:

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>(); 

Tenga en cuenta que esta es una de esas situaciones en las que es bastante más fácil de leer usando la notación de puntos:

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

intento por debajo de código

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