HtmlAgilityPackを使用して画像srcのデータURIを検出する

base64 c# html-agility-pack

質問

私は多くのhtmlを処理し、それをPDFファイルに変換します。私は自分のHTMLを変換する前に、画像のいずれかが参照ファイルであるかどうかを検出する必要があります。それが参照されたファイルであれば、それらをbase64でエンコードし、srcをそのファイルに置き換えます。

今、私はRegexを使って私の検出を行っていますが、HtmlAgilityPackを使用しているので、HtmlAgilityPackで同じことを達成できるかどうか疑問に思っていましたか?

私はこれをやりたいので、現在HtmlAgilityPackを使っているときにRegexを維持する必要はありません。

だから今私はRegExを介して、次のようにデータuriを検出しています:

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

受け入れられた回答

HtmlAgilityPackには、データURIを検出するための組み込み関数がないため、このような関数の独自実装を組み込む必要があります。

さて、HtmlAgilityPackのLINQ APIを使用して、参照src属性を持つimg要素を最初に選択することができます。

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

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



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ