LinqToXML правильная проверка на ноль с несколькими дочерними слоями

Допустим, я ожидаю XML следующим образом и пытаюсь получить данные в layer3:

<Layer1>
   <Layer2>
      <Layer3>Test</Layer3>
   </Layer2>
</Layer1>

C#:

var data = doc.Element("Layer1").Element("Layer2").Element("Layer3");

Если элементы layer1 или layer2 отсутствуют, это приведет к нулевому исключению. Я оборачиваю эти запросы с помощью try/catch и по умолчанию устанавливаю переменную в блоке catch, но этот метод пахнет. Есть ли лучший способ установить переменную data в null, если какой-либо из слоев отсутствует?

1 ответ

Решение
var data = doc.Elements("Layer1").Elements("Layer2").Elements("Layer3").SingleOrDefault();

Обратите внимание на использование элемента * s *.

IEnumerable<T : XContainer>.Elements возвращает коллекцию дочерних элементов. Коллекция может быть пустой, но она не будет нулевой. Таким образом, вы можете цепи Elements звонки без страха перед NullReferenceException,


Как примечание, это то, что VB делает, когда вы пишете

Dim data = doc.<Layer1>.<Layer2>.<Layer3>.SingleOrDefault()

(хотя в VB вы бы использовали удобный IEnumerable<XElements>.Value метод расширения вместо SingleOrDefault, который, к сожалению, недоступен в C#. Пожалуйста, оставьте комментарий, если вы знаете эквивалент C#.)

Другие вопросы по тегам