Проверьте, существует ли xelement - PullRequest
1 голос
/ 06 марта 2009

Я читаю XML-файл, который выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<VehicleList>
 <Vehicle>
  <Item>
   <Name>F-150</Name>
   <Maker>Ford</Maker>
   <Color>Black</Color>
   <Price>30000</Price>
  </Item>
  <ItemSpecific>
   <NameValueList>
    <Name>Mileage</Name>
    <Value>56000</Value>
   </NameValueList>
   <NameValueList>
    <Name>Year</Name>
    <Value>2003</Value>
   </NameValueList>
  </ItemSpecific>
 </Vehicle>
 <!-- more Vehicle nodes here -->
</Vehicles>

Это примерные данные, возвращаемые веб-службой eBay, поэтому не обращайте на меня внимания.

В любом случае, я использую такой код для чтения XML и размещения всех транспортных средств в объекте List (of Vehicle), например:

   Dim vehicles = From v in doc...<Vehicle> _
   Let mile = (From x In v.<ItemSpecific>.<NameValueList> Where x.<Name>.Value = "Mileage" Select x.<Value>.Value).Single _
                   Let year = (From z In v.<ItemSpecific>.<NameValueList> Where z.<Name>.Value = "Year" Select z.<Value>.Value).Single _
                   Select New Vehicle With {.Name = v.<Item>.<Name>.Value, .Maker = v.<Item>.<Maker>.Value, .Color = v.<Item>.<Color>.Value, .Mileage = mile, .Year = year}

Полученный List(Of Vehicle) затем привязывается к элементу управления ASP.NET ListView, в котором отображаются данные. Все идет хорошо , если присутствуют все нужные узлы. Например, узел Пробег является условным и иногда отсутствует. Всякий раз, когда узел отсутствует, я получаю ошибку «Sequence contains no elements».

Я перепробовал все, что знаю, чтобы все работало правильно. Есть ли способ проверить, существует ли XElement?

1 Ответ

2 голосов
/ 06 марта 2009

Это зависит от того, что вы хотите сделать, когда узла нет. Например, если ничего не приемлемо, вы можете переключиться с .Single на .SingleOrDefault. Последний ничего не вернет в случае пустой последовательности и не сгенерирует исключение.

Dim vehicles = From v in doc...<Vehicle> _
               Let mile = (From x In v.<ItemSpecific>.<NameValueList> Where x.<Name>.Value = "Mileage" Select x.<Value>.Value).SingleOrDefault _
               Let year = (From z In v.<ItemSpecific>.<NameValueList> Where z.<Name>.Value = "Year" Select z.<Value>.Value).SingleOrDefault _
               Select New Vehicle With {.Name = v.<Item>.<Name>.Value, .Maker = v.<Item>.<Maker>.Value, .Color = v.<Item>.<Color>.Value, .Mileage = mile, .Year = year}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...