Cómo reemplazar el comentario de HTML Etiquetas con cadena. Vacía

c# html html-agility-pack

Pregunta

Estoy tratando de eliminar todas las etiquetas de comentario Html de mi htmlNode. A continuación se muestra el código de selección HtmlNode de mi c #

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

código de pseudo marcado de HtmlNode devuelto a continuación

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

Logré configurar la expresión regular para resolver mi problema, el código c # es el siguiente. Pero, solo en mi ejecución de prueba funcionó correctamente y con el tipo de entrada como cadena. Vea el código c # a continuación.

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

Resultado = "". que es lo que quiero en vivo para todas las etiquetas.

He visto muchos ejemplos de código en foros y foros de stackoverflow. Pero nada está cerca de lo que quiero. Una publicación fue realmente útil, pero fue para php, así que de nuevo no sirve.

Ahora, si en la anterior función Regex.Replace entro

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

Me sale el siguiente error

La mejor coincidencia del método sobrecargado para 'System.Text.RegularExpressions.Regex.Replace (string, System.Text.RegularExpressions.MatchEvaluator, int)' tiene algunos argumentos no válidos

También traté de convertir

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

Pero luego obtengo rkr = "HtmlAgilityPack.HtmlNode" valor de retorno.

Cualquier ayuda sería de gran ayuda.

Respuesta aceptada

Gracias por toda tu ayuda. Encontré solución en la siguiente función.

Acaba de llamar a la función después de rellenar el doc5 de la siguiente manera

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();
}

Para referencia: encontré la respuesta en el siguiente post. Cómo seleccionar los tipos de nodo que son comentarios HtmlNodeType usando HTMLAgilityPack

Muy preciso y con muchos tipos de ejemplos diferentes, exactamente lo que buscaba.


Respuesta popular

Respondido aquí :

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

Nota: ToList es necesario porque no puede cambiar la secuencia que está enumerando.




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué