以下代码无法编译
Dim BasicGroups As String() = New String() {"Node1", "Node2"}
Dim NodesToRemove = From Element In SchemaDoc.Root.<Group> _
Where Element.@Name not in BasicGroups
For Each XNode In NodesToRemove
XNode.Remove()
Next
应该删除rootnode的所有Immediate子节点,该子节点具有名为name的属性,其值为不在BasicGroups StringArray中列出。
此任务的正确语法是什么?
答案 0 :(得分:3)
你可能想要移动'not'部分。例如(伪代码)
where (not (list.Contains(foo))
答案 1 :(得分:1)
如果可以使用简单模式匹配要删除的节点的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非常相似。
答案 2 :(得分:0)
也许你可以试试这样的事情
mylistWithOutUndesirebleNodes = (来自NodeLists.Cast()中的b where(来自NodesToDeleteList.Cast()中的c 其中c.Attributes [“atributo”]。值== b.Attributes [“atributo”]。值 选择c).Count()== 0 选择b).ToList();
答案 3 :(得分:0)
Dim NodesToRemove = From Element In SchemaDoc.Root.<Group> _
Where Not BasicGroups.Contains(Element.@Name)