Linq to XML'Where in in'语法问题

时间:2008-10-21 11:30:39

标签: linq linq-to-xml linq-to-objects

以下代码无法编译

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中列出。

此任务的正确语法是什么?

4 个答案:

答案 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)