2008-10-21 47 views
0

下面的代碼不能編譯LINQ到「凡不在」語法問題XML

Dim BasicGroups As String() = New String() {"Node1", "Node2"} 
Dim NodesToRemove = From Element In SchemaDoc.Root.<Group> _ 
        Where [email protected] not in BasicGroups 
For Each XNode In NodesToRemove 
    XNode.Remove() 
Next 

它應該刪除它有它的值是中列出的屬性稱爲名稱的根節點的任何直接子在BasicGroups StringArray中。

此任務的正確語法是什麼?

回答

3

您可能想要移動「不」部分。 EG(僞代碼)

where (not (list.Contains(foo)) 
+0

所以在我的情況下.....哪裏不BasicGroups.Contains(元素。@名稱)...哪些作品很好..謝謝。 – 2008-10-21 12:14:53

+0

好,我不確定VB的語法:) – leppie 2008-10-21 12:43:58

1

如果要刪除可以用一個簡單的模式匹配的節點的名稱屬性,下面應該工作:

Dim SchemaDoc As New XDocument(<Root><Group Name="Foo"/><Group Name="Node1"/> 
          <Group Name="Node2"/><Group name="Bar"/></Root>) 
Dim NodesToRemove = From Element In SchemaDoc.<Root>.<Group> Where _ 
          [email protected] Like "NotNode?" 
For Each XNode In NodesToRemove.ToArray() 
    XNode.Remove() 
Next 

請注意使用的ToArray的()在NodesToRemove的枚舉中:在開始修改它所基於的集合之前,需要這個強制對XQuery進行評估。

如果這不起作用,這裏有一個使用LINQ的替代方案(因爲我原先認爲在LINQ查詢中插入'not'不起作用,但我被另一個答案直接設置 - 每次你學到一些新東西天......):

Dim NodesToRemove As New Collections.ObjectModel.Collection(Of XNode) 
For Each Element In SchemaDoc.<Root>.<Group> 
    If Not BasicGroups.Contains([email protected]) Then 
    NodesToRemove.Add(Element) 
    End If 
Next 

性能應該與使用LINQ非常相似。

0

也許你可以嘗試這樣的事情

mylistWithOutUndesirebleNodes =在NodeLists.Cast (從B() 其中(從C在NodesToDeleteList.Cast() 其中c.Attributes [ 「atributo」。價值== b.Attributes [「atributo」]。值 select c).Count()== 0 select b).ToList();

0
Dim NodesToRemove = From Element In SchemaDoc.Root.<Group> _ 
        Where Not BasicGroups.Contains([email protected])