2012-08-24 39 views
7

Trong mã của tôi, tôi muốn xóa thẻ img không có giá trị src. Tôi đang sử dụng Đối tượng HtmlDocument của HTMLAgilitypack. Tôi đang tìm các img mà không có giá trị src và cố gắng để loại bỏ nó .. nhưng nó mang lại cho tôi lỗi Bộ sưu tập đã được sửa đổi; hoạt động điều tra có thể không thực hiện được. Có ai có thể giúp tôi vì điều này không? Mã mà tôi đã sử dụng là:xóa nút html khỏi 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 
    } 
} 

Trả lời

6

Những gì tôi đã làm là:

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

Có vẻ như bạn đang sửa đổi các bộ sưu tập trong thời gian liệt kê bằng cách sử dụng phương pháp HtmlNode.RemoveChild.

Để khắc phục điều này, bạn cần phải sao chép các nút của bạn vào danh sách/mảng riêng biệt bằng cách gọi điện, ví dụ: Enumerable.ToList<T>() hoặc Enumerable.ToArray<T>().

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

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

Nếu tôi đúng, vấn đề sẽ biến mất.

+0

Cảm ơn, Nó hoạt động cho tôi ..! – Priya

+0

@Piya, rất vui khi biết điều đó. Nhưng tôi nghĩ rằng bằng cách sử dụng một biểu thức xpath là dễ dàng hơn để làm cho mã của bạn dễ đọc hơn (chỉ cần chọn tất cả các nút để loại bỏ bằng một biểu thức). – Alex

+0

, Vâng Bạn đã đúng.Bây giờ tôi sẽ làm điều đó..Cảm ơn một lần nữa! – 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(); } 
    }); 
Các vấn đề liên quan