Détecter l'URI des données dans l'image src en utilisant HtmlAgilityPack

base64 c# html-agility-pack

Question

Je traite beaucoup de HTML et le transforme en fichiers PDF. Avant de pouvoir transformer mon code HTML, je dois détecter si une des images est un fichier référencé. S'il s'agit d'un fichier référencé, je les encode en base64 et remplace le src par celui-ci.

Pour le moment, je compte sur Regex pour effectuer la détection, mais depuis que j'utilise HtmlAgilityPack, je me demandais si je pouvais obtenir la même chose avec HtmlAgilityPack?

J'aimerais faire cela afin de ne pas avoir à maintenir Regex lorsque j'utilise déjà HtmlAgilityPack.

Je détecte donc les données URI via RegEx avec les éléments suivants:

void Main()
{
    var myHtml = @"<html><head></head><body><p><img src='data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs='/></p></body></html>";
    var htmlDoc = new HtmlDocument();
    htmlDoc.LoadHtml(myHtml);

    var imgs = htmlDoc.DocumentNode.SelectNodes("//img");
    if (imgs != null && imgs.Count > 0)
    {
        foreach (var imgNode in imgs)
        {
            var srcAttribute = imgNode.Attributes.FirstOrDefault(a => string.Equals("src", a.Name, StringComparison.InvariantCultureIgnoreCase));

            if (!string.IsNullOrEmpty(srcAttribute?.Value) && !StringIsDataUri(srcAttribute.Value))
            {
                Console.WriteLine("BASE ENCODE THE REFERENCED FILE");
            }
        }
    }
}

//Regex from http://stackoverflow.com/a/5714355/1958344
private static Regex regex = new Regex(@"data:(?<mime>[\w/\-\.]+);(?<encoding>\w+),(?<data>.*)", RegexOptions.Compiled);

private bool StringIsDataUri(string stringToTest)
{
    var match = regex.Match(stringToTest);
    return match.Success;
}

Réponse acceptée

HtmlAgilityPack n'a pas de fonction intégrée pour détecter les données URI, vous devez donc toujours incorporer votre propre implémentation de cette fonction.

En passant, vous pouvez utiliser l'API LINQ de HtmlAgilityPack pour sélectionner les éléments img ayant l'attribut de référence src :

var referenceImgs = htmlDoc.DocumentNode
                           .Descendants("img")
                           .Where(o => !StringIsDataUri(o.GetAttributeValue("src","")));

foreach(HtmlNode img in referenceImgs)
{
    Console.WriteLine("BASE ENCODE THE REFERENCED FILE");
}



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi