2011-02-15 23 views
6

¿Cómo puedo eliminar cualquier elemento en xml en función del valor del atributo coincidente?LINQ: ¿Eliminar elemento de XML según el valor del atributo?

Aquí es mi XML:

<Projects> 
    <Project serverUrl="tcp://xyz1:xxx/sdfsdf.rem" projectName="project1" /> 
    <Project serverUrl="tcp://xyz2:xxx/sdfsdf.rem" projectName="project2" /> 
    <Project serverUrl="tcp://xyz3:xxx/sdfsdf.rem" projectName="project3" /> 
    <Project serverUrl="tcp://xyz4:xxx/sdfsdf.rem" projectName="project4" /> 
    <Project serverUrl="tcp://xyz5:xxx/sdfsdf.rem" projectName="project5" /> 
    <Project serverUrl="tcp://xyz6:xxx/sdfsdf.rem" projectName="project6" /> 
    </Projects> 

estoy usando el siguiente LINQ consulta:

var remove = from elemet in xdoc.Elements("Projects").Elements("Project") 
           where elemet.Attribute("projectName").Value == "project1" 
           select elemet.Parent.Remove(); 

estoy consiguiendo error de compilación tiempo de selección como:

El tipo de expresión en la cláusula select es incorrecta

EDITAR RESPUESTA: este funciona para mí. Gracias Todo

var xElement = (from elemet in xdoc.Elements("Projects").Elements("Project") 
          where elemet.Attribute("projectName").Value == foundProject 
          select elemet); 
      xElement.Remove(); 

Respuesta

4

Se puede utilizar el siguiente fragmento de código:

xdoc.XPathSelectElement("Projects/Project[@projectName = 'project1']").Remove(); 
1

Remove() es un método que se llama en una XNode. Su consulta está intentando seleccionar el método que no tiene ningún sentido.

Lo que realmente quiere hacer es seleccionar el elemento que desea eliminar y luego llamar al método Eliminar() en el elemento seleccionado. Se puede encontrar un ejemplo aquí: XNode.Remove Method

7

usted podría utilizar

xdoc.Elements("Projects").Elements("Project").Where(
        elemet => elemet.Attribute("projectName").Value == "project1") 
.ToList().ForEach(i => i.Remove()); 

o

(from elemet in xdoc.Elements("Projects").Elements("Project") 
          where elemet.Attribute("projectName").Value == "project1" 
          select elemet).ToList().ForEach(i => i.Remove()); 
9

Remove es una llamada al método (void), no es una función que puede devolver un valor. Es posible que desee algo como esto:

var elementsToRemove = from elemet in xdoc.Elements("Projects").Elements("Project") 
         where elemet.Attribute("projectName").Value == "project1" 
         select elemet; 

foreach (var e in elementsToRemove) 
    e.Remove(); 

LINQ es un lenguajeconsulta, que es (principalmente) se utiliza para retorno algo. La ejecución de acciones en estos elementos suele ser un paso separado.

Cuestiones relacionadas