用于.NET的HTML Diff组件

时间:2009-07-24 21:45:22

标签: c# .net diff

是否有人知道可以执行HTML Diffs的良好托管代码.NET组件?我想比较两个HTML文件并显示差异。

4 个答案:

答案 0 :(得分:0)

Microsoft有一个名为XmlDiffPatch的托管代码工具,它也适用于HTML文件。您可以将其作为独立的可执行文件运行,或将diff程序集导入项目中。

答案 1 :(得分:0)

检查htmldiff.net项目。

答案 2 :(得分:0)

如果您正在寻找托管解决方案,http://changedetection.comhttp://imnosy.com似乎都会在网页上查找差异。

答案 3 :(得分:0)

我尝试了上面提到的 htmldiff.net ,但是发现比较模糊,不能充分描述我的需求。我担心这可能会产生假阳性结果,即使HTML的格式略有不同,但在浏览器中呈现的格式相同(即标记中属性的排序顺序不同或不同),我也必须确保比较正确无误。样式属性中定义之间的间隔)

我发现唯一可以正确完成此工作的工具是 HTML Tidy www.html-tidy.org)。它不是一个HTML比较工具,但是它确实提供了很多控制方式,让您可以先将HTML整理/清理/规范化为正常形式,然后再实现自己的比较。

有许多语言的HTML Tidy包装器。我使用 TidyHtml5ManagedRepack http://www.teosoft.it/TidyHtml5Managed)。在Visual Studio的NuGet中可用。

我在C#中使用以下两种方法来规范化和清理HTML ...

public static string HtmlNormalise(this String html)
{
    Document doc = Document.FromString(html);
    doc.OutputBodyOnly = AutoBool.Yes;
    doc.Quiet = true;
    doc.AttributeSortType = TidyManaged.SortStrategy.Alpha;
    doc.DropEmptyElements = false;
    doc.DropEmptyParagraphs = false;
    doc.DropProprietaryAttributes = false;
    doc.MergeDivs = TidyManaged.AutoBool.No;
    doc.MergeSpans = TidyManaged.AutoBool.No;
    doc.WrapAt = 0;
    doc.Markup = true;
    doc.CleanAndRepair();
    return doc.Save().Replace("\r\n", "");
}

public static string HtmlClean(this String html)
{
    Document doc = Document.FromString(html);
    doc.OutputBodyOnly = AutoBool.Yes;
    doc.Quiet = true;
    doc.AttributeSortType = TidyManaged.SortStrategy.Alpha;
    doc.DropEmptyElements = false;
    doc.DropEmptyParagraphs = false;
    doc.DropProprietaryAttributes = false;
    doc.MergeDivs = TidyManaged.AutoBool.No;
    doc.MergeSpans = TidyManaged.AutoBool.No;
    doc.WrapAt = 0;
    doc.Markup = true;
    doc.MakeClean = true;
    doc.CleanAndRepair();
    return doc.Save().Replace("\r\n", "");
}

我使用这些方法进行清理,然后将HTML作为这样的字符串进行比较...

var Html1Cleaned = Html1.HtmlClean();
var Html2Cleaned = Html2.HtmlClean();

if (Html1Cleaned.Equals(Html2Cleaned))
    
    Console.WriteLine("Html1 and Html2 are the same");
else
   
    Console.WriteLine("Html1 and Html2 are different");

或者像这样在一次操作中进行清理和比较...

if (Html1.HtmlClean().Equals(Html2.HtmlClean()))
    
    Console.WriteLine("Html1 and Html2 are the same");
else
   
    Console.WriteLine("Html1 and Html2 are different");