2016-10-14 5 views
1

Хорошо, я здесь, как я могу удалить родительский узел и заменить его своим дочерним?Удалить родительский узел, но сохранить пакет htmlagility для дочерних узлов?

Моя цель - удалить исходящие ссылки из изображений. Я не хочу удалять нормальные ссылки из документа, просто удаляю те, которые делают изображение в ссылку, сохраняя изображение неповрежденным. Пример:

<a href="http://www.w3schools.com"><img src="logo_w3s.gif"></a> 

Должны быть заменены и стали:

<img src="logo_w3s.gif"> 

Вот мой код, который не работает, но я чувствую, приближается:

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
doc.LoadHtml(maintext); 
dynamic allimages = doc.DocumentNode.Descendants("img").ToList; 

if (scrapeimages.Checked) { 
    //the user does want images scraped. Remove image outbound links 
    try { 
     foreach (void n_loopVariable in allimages) { 
      n = n_loopVariable; 
      if (n.ParentNode.Name == "a") { 
       dynamic outer = n.OuterHtml; 
       dynamic newnode = HtmlNode.CreateNode(outer); 

       n.ParentNode.ReplaceChild(n.ParentNode, newnode); 

      } 
     } 
     maintext = doc.DocumentNode.OuterHtml; 
    } catch { 
    } 
} 
+0

Btw Я использовал конвертер для преобразования этого из Vb.net в C#, так что если есть странные ошибки, которые, вероятно, почему. –

+0

Проверьте мой ответ и скажите мне, помогли ли вы. – mybirthname

+1

Черт возьми, да. Я бы никогда не подумал сделать так. Спасибо! –

ответ

1
var node = doc.DocumentNode.SelectSingleNode(yourANode); 
node.ParentNode.RemoveChild(node, true); 

Что-то вроде это должно помочь, это приведет к удалению Ребенка из родительского узла вашего <a>, но он будет держать grandChildren. Этот истинный параметр в RemoveChild указывает keepGrandChild.

Если все <img> имеют <a>

var nodeList = doc.DocumentNode.SelectNodes("img"); 

for(HtmlNode node in nodeList) 
{ 
    var parentATagNode = node.Parent.Parent; 
    parentATagNode.RemoveChild(node.Parent, true); 
} 
Смежные вопросы