2014-10-18 2 views
0

В настоящий момент я нахожусь в запасе, выясняя, как вставить HTML-тег вне выбранного тега.Как вставить HTML-тег вне выбранного тега?

Что я загружаю по HtmlDocument - это текстовый файл, содержащий «некоторые» HTML-теги. Это не HTML-документ, содержащий тег, но это текстовый файл с «некоторыми» тегами HTML.

вот содержание образца текстового файла

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas vel risus id velit iaculis elementum egestas vel purus. Vestibulum ante ipsum primis in <a href="http://www.domain.com">this domain</a> faucibus orci luctus et ultrices posuere cubilia Curae; In lorem enim, dignissim id congue at, malesuada vitae sem. Phasellus et nibh venenatis, vulputate elit ut, consectetur tellus. 

Sed placerat ex et dolor lobortis convallis. Nulla tincidunt elementum elementum. Integer lacinia elementum orci, ac pretium lacus hendrerit eu. Donec vitae lorem leo. Curabitur placerat sagittis nisi eu posuere. Vestibulum eget felis nisi. Nunc vitae enim iaculis, <a href="http://www.domain.com">this domain</a> maximus justo ullamcorper, imperdiet felis. Vestibulum vestibulum sapien id diam dapibus pharetra. Pellentesque varius purus justo, a vehicula lectus semper at. 

Есть два тега А там и мой XPath просто просто, как «// а». Моя цель есть, чтобы украсить Тег вокруг с B, U или I. Выход хотел

<b><u><a href="http://www.domain.com">this domain</a></u></b> 

Я надеялся HtmlNode.InsertBefore бы помочь, но то, что произошло, как этот

<a href="http://www.domain.com">this domain<b></b><u></u></a> 

если используется HtmlNode.InsertAfter, она будет выглядеть следующим образом

<a href="http://www.domain.com"><b></b><u></u>this domain</a> 

в обоих InsertBefore и InsertAftere, это требует Reference Node, нет опорного узла, так что я просто установить нулевую

Вот пример кода

HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml(this.document); 

HtmlNodeCollection nodcoll = doc.DocumentNode.SelectNodes("//a"); 
if (nodcoll != null) 
{ 
    foreach (HtmlNode nod in nodcoll) 
    { 
     // nod.InsertAfter(HtmlNode.CreateNode(newhtml), null); 
     // nod.InsertBefore(HtmlNode.CreateNode(newhtml), null); 
    }   
} 

обновление Я забыл упомянуть, что это предпочтение SEO о форматировании тега. Если форматирование было внутри тэга, то это будет намного проще

+0

с JQuery обходе через DOM является ветер :) – Milkmannetje

+0

возможно дубликат [Surround существующего узла с другой узел с Agility Pack] (http://stackoverflow.com/questions/11540415/surround-existing-node-with-another-node-with-agility-pack) –

ответ

1

Вариант А

Одним из способов вы могли бы добиться этого было бы заменой InnerHtml так:

var nodeList = doc.DocumentNode.SelectNodes("//a"); 
if (nodeList != null && nodeList.Count > 0) 
{ 
    foreach (var node in nodeList) 
    { 
     node.InnerHtml = "<b><u>" + node.InnerHtml + "</b></u>"; 
     // can also be written as: 
     // node.InnerHtml = node.InnerHtml.Replace(node.InnerHtml, "<b><u>" + node.InnerHtml + "</b></u>"); 
    } 
} 

выше будет производим:

<a href="http://www.domain.com"><b><u>this domain</u></b></a> 

Вариант B

Другим способом путем замены узла будет:

var nodeList = doc.DocumentNode.SelectNodes("//a"); 
if (nodeList != null && nodeList.Count > 0) 
{ 
    foreach (var node in nodeList) 
    { 
     // Reads the outer or you lose the link element 
     var newNodeStr = "<b><u>" + node.OuterHtml + "</b></u>"; 
     // Replace the old node with our newly created one 
     var newNode = HtmlNode.CreateNode(newNodeStr); 
     node.ParentNode.ReplaceChild(newNode, node); 
    } 
} 

выше будет производить:

<b><u><a href="http://www.domain.com">this domain</a></u></b> 
+0

да, но помните, что цель состоит в том, чтобы иметь такое форматирование вне тег A. Это предпочтение нашего SEO :( – jaysonragasa

+0

@jaysonragasa см. *** вариант B. *** – Prix

+0

Вариант B работал! Спасибо! – jaysonragasa

Смежные вопросы