2012-08-24 32 views
7

En mi código, quiero eliminar la etiqueta img que no tiene valor src. Estoy usando objeto HtmlDocument de HTMLAgilitypack. Estoy buscando el img que no tiene valor src y trato de eliminarlo ... pero me da error La colección se modificó; la operación de enumeración no se puede ejecutar. ¿Alguien puede ayudarme con esto? El código que he utilizado es:eliminar nodo html de htmldocument: HTMLAgilityPack

foreach (HtmlNode node in doc.DocumentNode.DescendantNodes()) 
{ 
    if (node.Name.ToLower() == "img") 
    {        
      string src = node.Attributes["src"].Value; 
      if (string.IsNullOrEmpty(src)) 
      { 
       node.ParentNode.RemoveChild(node, false);  
      } 
    } 
    else 
    { 
      ..........// i am performing other operations on document 
    } 
} 

Respuesta

6

Lo que he hecho es:

List<string> xpaths = new List<string>(); 
    foreach (HtmlNode node in doc.DocumentNode.DescendantNodes()) 
    { 
         if (node.Name.ToLower() == "img") 
         { 
          string src = node.Attributes["src"].Value; 
          if (string.IsNullOrEmpty(src)) 
          { 
           xpaths.Add(node.XPath); 
           continue; 
          } 
         } 
    } 

    foreach (string xpath in xpaths) 
    { 
      doc.DocumentNode.SelectSingleNode(xpath).Remove(); 
    } 
17

Parece que se está modificando la colección durante la enumeración mediante el uso de HtmlNode.RemoveChild método.

Para solucionar esto, necesita copiar sus nodos a una lista/matriz por separado llamando a, por ejemplo, Enumerable.ToList<T>() o Enumerable.ToArray<T>().

var nodesToRemove = doc.DocumentNode 
    .SelectNodes("//img[not(string-length(normalize-space(@src)))]") 
    .ToList(); 

foreach (var node in nodesToRemove) 
    node.Remove(); 

Si tengo razón, el problema desaparecerá.

+0

Gracias, funciona para mí ..! – Priya

+0

@Piya, me alegra oír eso. Pero creo que al usar una expresión xpath es más fácil hacer que tu código sea más legible (solo selecciona todos los nodos para eliminar con una expresión). – Alex

+0

, Sí. Tienes razón. Bien, lo haré ... ¡Gracias de nuevo! – Priya

2
var emptyImages = doc.DocumentNode 
.Descendants("img") 
.Where(x => x.Attributes["src"] == null || x.Attributes["src"].Value == String.Empty) 
.Select(x => x.XPath) 
.ToList(); 

emptyImages.ForEach(xpath => { 
     var node = doc.DocumentNode.SelectSingleNode(xpath); 
     if (node != null) { node.Remove(); } 
    }); 
Cuestiones relacionadas