Come sostituire il commento HTML tag con string.Empty

c# html html-agility-pack

Domanda

Sto cercando di rimuovere tutti i tag di commento HTML dal mio htmlNode, Di seguito è riportato il codice di selezione HtmlNode dal mio c #

HtmlNode table = doc5.DocumentNode.SelectSingleNode("//div[@id='div12']");

riportato di seguito il codice di pseudo markup HtmlNode

<table>
  <tr>
    <td>test</td>
    <td>
      <!-- <a href='url removed' >Test link Test 2 Comment </a> -->
    </td>
  </tr>
</table>​

Sono riuscito a configurare l'espressione regolare per risolvere il mio problema, il codice c # è il seguente. Ma, solo nel mio test, è riuscito a funzionare correttamente e con il tipo di input come stringa. Vedi il codice c # qui sotto.

string rkr;
rkr = "<!-- <a href='url removed' >Test link Test 2 Comment </a> -->";
rkr = Regex.Replace(rkr, @"(\<!--\s*.*?((--\>)|$))",String.Empty);

Risultato = "". che è quello che voglio in diretta per tutti i tag.

Ho visto molti esempi di codice sui forum e sul forum StackOverflow. ma nulla è vicino a ciò che voglio. un post è stato davvero utile ma era per php, quindi di nuovo inutile.

Ora, se nella funzione Regex.Replace sopra inserisco

rkr = Regex.Replace(table, @"(\<!--\s*.*?((--\>)|$))",String.Empty);

Ottengo l'errore seguente

La migliore corrispondenza del metodo sovraccarico per "System.Text.RegularExpressions.Regex.Replace (string, System.Text.RegularExpressions.MatchEvaluator, int)" presenta alcuni argomenti non validi

Ho anche provato a convertire

rkr = Regex.Replace(table.ToString(), @"(\<!--\s*.*?((--\>)|$))",String.Empty);

Ma poi ottengo il valore di ritorno rkr = "HtmlAgilityPack.HtmlNode".

Qualsiasi aiuto sarebbe di grande aiuto.

Risposta accettata

Grazie a tutti per il vostro aiuto. Ho trovato la soluzione nella seguente funzione.

Ho appena chiamato la funzione dopo aver popolato il doc5 come segue

HtmlNode table = doc5.DocumentNode.SelectSingleNode("//div[@id='div12']");

RemoveComments(table);

public static void RemoveComments(HtmlNode node)
{
    foreach (var n in node.ChildNodes.ToArray())
        RemoveComments(n);
    if (node.NodeType == HtmlNodeType.Comment)
        node.Remove();
}

Per riferimento: ho trovato la risposta nel seguente post. Come selezionare i tipi di nodo che sono HtmlNodeType Comment utilizzando HTMLAgilityPack

molto preciso e con molti tipi di esempi diversi, esattamente quello che cercavo.


Risposta popolare

Risposto qui :

doc5.DocumentNode.Descendants()
    .Where(n => n.NodeType == HtmlAgilityPack.HtmlNodeType.Comment)
    .ToList()
    .ForEach(n => n.Remove());

Nota: ToList è necessario, perché non è possibile modificare la sequenza che si sta enumerando.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché