Как извлечь значение из XML с помощью LINQ?

1

Я пытаюсь вернуть только один результат из следующего XML при поиске по UID:

<Photos>
  <Photo UID="a3d508784ff3456da7bf2ff8ce08e577">
    <Date>2014-08-22T14:00:32.7958436+01:00</Date>
    <File>a3d508784ff3456da7bf2ff8ce08e577.jpg</File>
    <CrimeRef>CR123456/14</CrimeRef>
  </Photo>
  <Photo UID="735620a99f2c4dfd9f2c1870136e993e">
    <Date>2014-08-22T14:07:29.0364635+01:00</Date>
    <File>735620a99f2c4dfd9f2c1870136e993e.jpg</File>
    <CrimeRef>CR999999/99</CrimeRef>
  </Photo>
  <Photo UID="c186993e8a0246c29dd180396dfea47b">
    <Date>2014-08-22T14:07:29.6835282+01:00</Date>
    <File>c186993e8a0246c29dd180396dfea47b.jpg</File>
    <CrimeRef>CR999999/99</CrimeRef>
  </Photo>
</Photos>

Для этого я использую следующий код:

var fileList = xml.Descendants("Photo")
                  .Where(e => e.Attribute("UID") != null 
                         && (string)e.Attribute("UID").Value == ID)
                  .ToList();

var fileName = fileList[0];

Проблема в том, что fileList [0] имеет весь XML-элемент, а не только имя файла:

Изображение 174551

Нужно ли вообще сделать эквивалент "select File from" в LINQ, который позволит мне просто вернуть значение "Файл" для этого элемента? Я пробовал делать это без везения:

var fileName = fileList[0]['File'];

Большое спасибо

  • 3
    Добавьте .Select(x=>(string)x.Element("File")) после Where
  • 0
    Большое спасибо LB! Пожалуйста, добавьте в качестве ответа, и я приму это :)
Теги:
linq

2 ответа

4
Лучший ответ

Просто добавь

.Select(x=>(string)x.Element("File")) 

после Where

PS: Кастинг XElement для типа более безопасен, так как он не будет также генерировать исключение, даже если тег файла не существует (просто возвращает null)

  • 1
    Работает отлично, спасибо большое!
  • 0
    +1 - не знал лакомый кусочек про кастинг.
2

Select() в File узла Value свойства в вашем LINQ:

var fileList = xml.Descendants("Photo")
        .Where(e => e.Attribute("UID") != null && (string)e.Attribute("UID").Value == ID)
        .Select(n => n.Element("File").Value)
        .ToList();
  • 0
    Большое спасибо Кори, это прекрасно работает :)
  • 2
    это вернет элемент, включающий теги xml, а не значение.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню