LinqToXML适当地使用多个子层进行空检查

时间:2012-07-19 17:17:40

标签: c# linq-to-xml

让我说我期待XML如下,我正在尝试在第3层中提取数据:

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

C#:

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

如果缺少layer1或layer2元素,则会导致null异常。我一直用try / catch包装这些查询,并在catch块中默认变量,但这种方法闻起来。如果缺少任何图层,是否有更好的方法将“data”变量设置为null?

1 个答案:

答案 0 :(得分:4)

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

请注意使用元素* s *

IEnumerable<T : XContainer>.Elements会返回子元素的集合。该集合可能为空,但不会为null。因此,您可以链接Elements来电,而不必担心NullReferenceException


作为旁注,这是VB编写时的作用

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

(虽然在VB中,你会使用方便的IEnumerable<XElements>.Value extension method而不是SingleOrDefault,这是不幸的,在C#中不可用。如果你知道C#等价物,请发表评论。)