2012-08-24 12 views
7

W moim kodzie chcę usunąć tag img, który nie ma wartości src. Używam obiektu HTTMLDocument obiektu HtmlDocument. Znajduję plik img, który nie ma wartości src i próbuje go usunąć .. ale daje mi błąd. Kolekcja została zmodyfikowana; operacja wyliczania może nie zostać wykonana. Czy ktoś może mi w tym pomóc? Kod których użyłem to:usunąć węzeł html z 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 
    } 
} 

Odpowiedz

6

Co mam zrobić to:

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

Wydaje jesteś modyfikacji kolekcji podczas wyliczania za pomocą HtmlNode.RemoveChild metody.

Aby to naprawić, musisz skopiować swoje węzły na osobną listę/tablicę, dzwoniąc np. Enumerable.ToList<T>() lub Enumerable.ToArray<T>().

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

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

Jeśli mam rację, problem zniknie.

+0

Dzięki, to działa na mnie ..! – Priya

+0

@Piya, cieszę się, że to słyszę. Ale myślę, że za pomocą jednego wyrażenia xpath łatwiej jest uczynić twój kod bardziej czytelnym (wystarczy wybrać wszystkie węzły do ​​usunięcia za pomocą jednego wyrażenia). – Alex

+0

, Tak, masz rację. OK, zrobię to. Jeszcze raz dziękuję! – 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(); } 
    }); 
Powiązane problemy