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

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

假设我的输入类似于下图所示:

<h1>Test</h1> 
Hello World</h2> 
<h3>Missing close h3 tag

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

- Start tag <h2> was not found
- End tag </h3> was not found

这很好...

我的问题是我希望整个 html 有效,即使用适当的 <head><body>标记,因为此 html 稍后可用于预览,请下载为 .html 文件。

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

任何想法或其他选项将不胜感激。谢谢

最佳答案

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

bool hasHead = doc.DocumentNode.SelectSingleNode("html/head") != null;
bool hasBody = doc.DocumentNode.SelectSingleNode("html/body") != null;

如果没有 HTML 元素,或者如果 HTML 元素下没有 BODY 元素,这些将失败。

请注意,我不使用这种 XPATH 表达式 "//head",因为即使 head 不在 HTML 元素的正下方,它也会给出结果。

关于c# - 如何使用 Html Agility Pack 进行 HTML 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16645257/

相关文章:

c# - File.Exists 返回 true 并且 OpenExisting 失败并出现 DirectoryNotFoundException

c# - 使整个应用程序可以访问数据(可能在运行时发生变化)的最佳方式?

c# - WPF 自定义控件属性未接收数据绑定(bind)

c# - 线程池是否在应用程序域之间共享?

.net - TD中的XPath All A,也包含带有“Directs”内文的H3

c# - HtmlAgility :no contents appeared (C#, UWP)

C# Html 敏捷包 ( SelectSingleNode )

c# - 通过 URL 请求将参数传递给 azure 持久函数

c# - 将 html 表格/图表元素转换为图像

c# - 在 HtmlAgilityPack 中加载文档的 url 时,如何添加 webRequest 以设置超时?