Referencia nula de HTML Agility Pack

c# html-agility-pack

Pregunta

Tengo algunos problemas con el paquete de agilidad HTML.

Obtengo una excepción de referencia nula cuando uso este método en HTML que no contiene el nodo específico. Al principio funcionó, pero luego dejó de funcionar. Esto es solo un fragmento y hay alrededor de 10 bucles foreach más que seleccionan diferentes nodos.

¿Qué estoy haciendo mal?

public string Export(string html)
{
    var doc = new HtmlDocument();
    doc.LoadHtml(html);
    // exception gets thrown on below line
    foreach (var repeater in doc.DocumentNode.SelectNodes("//table[@class='mceRepeater']"))
    {
        if (repeater != null)
        {
            repeater.Name = "editor:repeater";
            repeater.Attributes.RemoveAll();
        }
    }

    var sw = new StringWriter();
    doc.Save(sw);
    sw.Flush();

    return sw.ToString();
}

Respuesta aceptada

AFAIK, DocumentNode.SelectNodes podría devolver null si no se encuentran nodos.

Este es el comportamiento predeterminado, vea un hilo de discusión en codeplex: ¿Por qué DocumentNode.SelectNodes devuelve nulo?

Así que la solución podría ser reescribir el bloque foreach :

var repeaters = doc.DocumentNode.SelectNodes("//table[@class='mceRepeater']");
if (repeaters != null)
{
    foreach (var repeater in repeaters)
    {
        if (repeater != null)
        {
            repeater.Name = "editor:repeater";
            repeater.Attributes.RemoveAll();
        }
    }
}

Respuesta popular

Esto se ha actualizado y ahora puede evitar que SelectNodes devuelva nulo configurando doc.OptionEmptyCollection = true , como se detalla en este problema de github .

Esto hará que devuelva una colección vacía en lugar de nula si no hay nodos que coincidan con la consulta (aunque no estoy seguro de por qué este no era el comportamiento predeterminado)




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é