我处理了很多用于转换的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
元素或属性,然后开始处理我的转换,如果元素不在那里只会默默地,优雅地失败,继续我的代码中的下一件事。
有什么想法吗?
答案 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>