是否有更好/更快的方法来编码Linq-to-XML中的“IsNot Nothing”?

时间:2011-04-24 14:55:36

标签: .net vb.net linq-to-xml

我处理了很多用于转换的XML。我通常发现我花了大部分时间做这样的事情:

Dim elem1 = doc.<bignode>.<smallnode>.SingleOrDefault
If elem1 IsNot Nothing Then
    ''# do my transformation
End If

Dim attr1 = doc.<bignode>.<smallnode>.@attribute1
If attr1 IsNot Nothing AndAlso attr1 <> "1" Then
    ''# do my transformation
End If

我喜欢这些东西中有很多东西可以检查元素或属性是否存在,然后只有它存在才会有所作为。

我想这没关系,但我只是想知道是否有更好的方法来处理我Dim元素或属性,然后开始处理我的转换,如果元素不在那里只会默默地,优雅地失败,继续我的代码中的下一件事。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

您是否看过使用LINQ to XML?您可以创建一个省略空值的LINQ查询,而不是遍历节点。然后,您将迭代一个过滤的集合,从而免除IsNot Nothing个检查。

答案 1 :(得分:1)

AFAIK,以这种方式检查存在是你最好的选择。 IMO,这是一个很好的防御性编程,以及我如何在日常工作中处理它。即使我主动排除NULL值(或提供默认值),我也会检查是否存在。

答案 2 :(得分:1)

您可以使用扩展方法以更流畅的方式处理IsNot Nothing检查:

<Extension()>
Sub SafeTransform(ByVal element As XElement, ByVal transform As Action(Of XElement))
  If element IsNot Nothing Then
    transform(element)
  End If
End Sub

您必须将转换定义为单独的方法:

Sub Transform(ByVal element As XElement) As XElement
  '' # do my transformation
End Sub

这样称呼:

doc.<bignode>.<smallnode>.SingleOrDefault.SafeTransform(AddressOf Transform)

您还可以使用lambda表达式:

Dim transform As Action(Of XElement) = Sub(element)
  '' # do my transformation
End Sub
doc.<bignode>.<smallnode>.SingleOrDefault.SafeTransform(transform)

这些转换是子程序而不是函数。如果您想要返回已转换的XElement个对象,则应该真正研究LINQ to XML

这是一个愚蠢的LINQ to XML示例:

Dim doc As XDocument =
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Big>
  <Small Name="Foo"/>
  <Other Name="Bar"/>
</Big>

Dim transformedDoc = new XDocument( _
  new XElement( _
    doc.Root.Name,
    doc.Root.Elements.Select( _
      Function(element) _
        If(element.Name = "Small", new XElement("Transformed", element.Attributes()), element))))

这是转换后的XML:

<Big>
  <Transformed Name="Foo"/>
  <Other Name="Bar"/>
</Big>