2012-08-24 26 views
7

मेरे कोड में, मैं img टैग को हटाना चाहता हूं जिसमें src value नहीं है। मैं HTMLAgilitypack के HtmlDocument ऑब्जेक्ट का उपयोग कर रहा हूं। मुझे आईएमजी मिल रहा है जिसमें स्रोत मान नहीं है और इसे हटाने का प्रयास किया जा रहा है .. लेकिन यह मुझे त्रुटि देता है संग्रह को संशोधित किया गया था; गणना ऑपरेशन निष्पादित नहीं हो सकता है। क्या कोई इस के लिए मेरी मदद कर सकता है? कोड जो मैं का इस्तेमाल किया है है:htmldocument से HTML नोड को हटाएं: 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 
    } 
} 

उत्तर

6

मैंने क्या किया है:

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

यह आप HtmlNode.RemoveChild विधि का उपयोग कर गणना के दौरान संग्रह संशोधित कर रहे हैं लगता है।

इसे ठीक करने के लिए आपको अपने नोड्स को कॉल करके एक अलग सूची/सरणी में कॉपी करना होगा। Enumerable.ToList<T>() या Enumerable.ToArray<T>()

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

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

यदि मैं सही हूं, तो समस्या गायब हो जाएगी।

+0

धन्यवाद, यह मेरे लिए काम करता है ..! – Priya

+0

@Piya, यह सुनकर खुशी हुई। लेकिन मुझे लगता है कि एक एक्सपैथ अभिव्यक्ति का उपयोग करके आपके कोड को और अधिक पठनीय बनाना आसान है (केवल एक अभिव्यक्ति को हटाने के लिए सभी नोड्स का चयन करें)। – Alex

+0

, हाँ तुम सही हो.ठीक है मैं करूँगा..धन्यवाद! – 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(); } 
    });