如何使用Html Agility Pack进行HTML验证

Yas*_*ser 4 c# html-agility-pack

我正在使用HTML Agility Pack来验证我的HTML.以下是我正在使用的,

public class MarkupErrors
{
    public string ErrorCode { get; set; }
    public string ErrorReason { get; set; }
}

public static List<MarkupErrors> IsMarkupValid(string html)
{
    var document = new HtmlAgilityPack.HtmlDocument();
    document.OptionFixNestedTags = true;
    document.LoadHtml(html);

    var parserErrors = new List<MarkupErrors>();
    foreach(var error in document.ParseErrors)
    {
        parserErrors.Add(new MarkupErrors
                             {
                                 ErrorCode = error.Code.ToString(),
                                 ErrorReason = error.Reason
                             });
    }

    return parserErrors;
}
Run Code Online (Sandbox Code Playgroud)

所以说我的输入如下所示:

<h1>Test</h1> 
Hello World</h2> 
<h3>Missing close h3 tag
Run Code Online (Sandbox Code Playgroud)

所以我的当前函数返回以下错误列表

- Start tag <h2> was not found
- End tag </h3> was not found
Run Code Online (Sandbox Code Playgroud)

这很好......

我的问题是,我想整个HTML是有效的,这是一个正确的<head><body>标签,因为这个网站稍后将提供预览,下载为.html文件.

所以我想知道我是否可以使用HTML Agility Pack检查这个?

任何想法或其他选择将不胜感激.谢谢

Sim*_*ier 5

您可以检查HTML元素下是否有HEAD元素或BODY元素,例如:

bool hasHead = doc.DocumentNode.SelectSingleNode("html/head") != null;
bool hasBody = doc.DocumentNode.SelectSingleNode("html/body") != null;
Run Code Online (Sandbox Code Playgroud)

如果没有HTML元素,或者HTML元素下没有BODY元素,则会失败.

注意我不使用这种XPATH表达式,"//head"因为即使头部不直接位于HTML元素下,它也会产生结果.