Если атрибут 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
Обратите внимание на использование ToArray () в перечислении NodesToRemove: это понадобится вам для принудительной оценки XQuery перед началом изменения коллекции, на которой он основан.
Если это не сработает, вот альтернатива использованию LINQ (как изначально я думал, что вставка 'not' в запросы LINQ не будет работать, но я был прямо поставлен другим ответом - вы узнаете что-то новое каждый день ...):
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.