1

假设我期待 XML 如下,并且我试图在 layer3 中提取数据:

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

C#:

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

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

4

1 回答 1

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

注意Element*s*的使用。

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


附带说明一下,这就是 VB 在您编写时所做的

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

(尽管在 VB 中,您将使用方便的IEnumerable<XElements>.Value扩展方法而不是 SingleOrDefault,不幸的是,它在 C# 中不可用。如果您知道 C# 等效项,请留下评论。)

于 2012-07-19T17:19:47.667 回答