如果要删除的节点的 Name 属性可以使用简单的模式进行匹配,则以下内容应该有效:
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 _
Element.@Name Like "NotNode?"
For Each XNode In NodesToRemove.ToArray()
XNode.Remove()
Next
请注意在 NodesToRemove 枚举中使用 ToArray():在开始修改它所基于的集合之前,您需要它来强制评估 XQuery。
如果这不起作用,这里是使用 LINQ 的替代方法(因为最初我认为在 LINQ 查询中插入'not'是行不通的,但我被另一个答案直接设置了——你每天都会学到新东西...... ):
Dim NodesToRemove As New Collections.ObjectModel.Collection(Of XNode)
For Each Element In SchemaDoc.<Root>.<Group>
If Not BasicGroups.Contains(Element.@Name) Then
NodesToRemove.Add(Element)
End If
Next
性能应该与使用 LINQ 几乎相同。