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#.)