Linq a XML 'donde no está' problema de sintaxis
-
03-07-2019 - |
Pregunta
El siguiente código no se compila
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
Se supone que elimina cualquier hijo inmediato del nodo raíz que tiene un atributo llamado nombre cuyo valor es No incluido en el StringArray de BasicGroups.
¿Cuál es la sintaxis correcta para esta tarea?
Solución
Probablemente quieras mover la parte 'no'. Por ejemplo (código psuedo)
where (not (list.Contains(foo))
Otros consejos
Si el atributo Nombre de los nodos que se eliminarán puede coincidir con un patrón simple, lo siguiente debería funcionar:
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
Tenga en cuenta el uso de ToArray () en la enumeración de NodesToRemove: lo necesitará para forzar la evaluación de XQuery antes de comenzar a modificar la colección en la que se basa.
Si esto no funciona, aquí hay una alternativa al uso de LINQ (ya que originalmente pensé que insertar 'no' en las consultas LINQ no funcionaría, pero otra respuesta me dejó claro: aprendes algo nuevo todos los días ...):
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
El rendimiento debería ser prácticamente idéntico al uso de LINQ.
Tal vez puedas probar algo como esto
mylistWithOutUndesirebleNodes = (desde b en NodeLists.Cast () donde (desde c en NodesToDeleteList.Cast () donde c.Atributos [" atributo "]. Value == b.Attributes [" atributo "]. Value seleccione c) .Count () == 0 seleccione b) .ToList ();
Dim NodesToRemove = From Element In SchemaDoc.Root.<Group> _
Where Not BasicGroups.Contains(Element.@Name)