2011-04-24 65 views
0

我處理大量用於轉換的XML。我通常會發現,我花了我大部分時間做這樣的事情:Linq-to-XML中有沒有更好/更快的方法來編寫「IsNot Nothing」?

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

或者

Dim attr1 = doc.<bignode>.<smallnode>[email protected] 
If attr1 IsNot Nothing AndAlso attr1 <> "1" Then 
    ''# do my transformation 
End If 

我喜歡這些東西,檢查元素或屬性,然後存在數不勝數只有當它存在時我纔會做點什麼。

我想這樣可以,但我只是想知道是否有一些更好的方法來處理這個元素或屬性,然後開始處理我的轉換,如果元素不存在,它會靜靜地並優雅地失敗,並繼續在我的代碼中的下一件事。

有什麼想法?

回答

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 expressio n:

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> 
+0

完美的,很多偉大的例子在這裏。 – 2011-04-26 02:40:15

2

你看過使用LINQ to XML?您可以創建一個省略空值的LINQ查詢,而不是迭代節點。然後,您將遍歷一個篩選集,以避免IsNot Nothing檢查。

+0

我種得看着它。這聽起來像是「doc」。 (函數(e)e.SingleOrDefault.Name =「smallnode」)或某些這樣的邏輯。那是你在想什麼? – 2011-04-24 19:09:02

1

AFAIK,以這種方式檢查存在是你最好的選擇。國際海事組織,這是很好的防守計劃,以及我如何在日常基礎上處理它。即使我主動排除NULL值(或提供它們的默認值),我會經常檢查是否存在。

+0

有趣的一點 - 我以爲我是唯一一個:)其實,我沒有稱之爲「防禦性編程」,我把它稱爲「很多代碼」:) – 2011-04-24 19:10:04

相關問題