2010-11-29 1 views
5

Учитывая эту структуру:Как проверить, содержит ли XML элемент при использовании 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; } 
} 

я использую LINQ к XML, чтобы получить данные из файла XML, например:

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

Моя проблема заключается в том, что не все элемент пользователя содержит userImageLocation, и при попытке прочитать userImageLocation он выдает исключение.

Как проверить, существует ли XML-элемент, а если он существует, прочитайте его?

ответ

7

Ваш текущий код не будет скомпилирован, так как вы пытаетесь присвоить свойство строки XElement. Я предполагаю, что вы используете свойство XElement.Value, чтобы преобразовать его в строку. Вместо этого, используйте явное преобразование строки, которая будет возвращать нулевое значение, если вы это называете «на» нулевой XElement ссылки:

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

Следует отметить, что это одна из тех ситуаций, что является гораздо более читаемым, используя точечную нотацию:

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

попытка ниже кода

UserImageLocation = user.Element("userImageLocation")!=null?user.Element("userImageLocation").Value:string.Empty 
Смежные вопросы