我试图在每个具有 alt 属性的标签中添加一个标题属性到 3-400 个文件。这些文件中 90% 是 asp 文件,其余的是 aspx/html/++。
我决定用 HTMLAgilityPack 修复它并用 C# 编写一个小程序来做到这一点。我只是将文件名写入 .txt 文件,然后运行该文本文件以加载每个文件。该程序运行良好,只是 HAP 不断添加右括号并修改某些其他标签。我以为我可以忍受它,只需将错误写入另一个 txt 文件,但注意到并非所有这些更改实际上都写入了我设置的字符串以保留错误消息(我看到的文件已更改,但是当我检查我的错误日志文件,没有关于这些更改的消息)
主要添加的是/tr、/td 和/table。
这个项目相当大(这些文件只是整个项目的一小部分),我真的不想添加我需要的任何其他更改。
首先是与我的问题有关的程序部分:
static void Main(string[] args)
{
string[] files = System.IO.File.ReadAllLines(@"filelist.txt");
string errors = "";
HtmlDocument doc = new HtmlDocument();
bool dirExists;
doc.OptionCheckSyntax = false;
doc.OptionReadEncoding = false;
doc.OptionOutputOriginalCase = true;
doc.OptionWriteEmptyNodes = true;
HtmlNode.ElementsFlags.Remove("option");
foreach (string file in files)
{
doc.Load(file);
if (doc.DocumentNode.SelectNodes("//@alt") != null)
{
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//@alt"))
{
if (!node.GetAttributeValue("title", false))
{
foreach (HtmlAttribute attr in node.Attributes.ToList())
{
if (attr.Name == "alt")
{
node.SetAttributeValue("title", attr.Value);
}
}
}
}
string newfile = file.Replace("C:\\source\\", "C:\\SLtmp\\");
string[] tmp = newfile.Split('\\');
string folder = "";
for (int i = 0; i < tmp.Length - 1; i++)
{
folder += tmp[i] + '\\';
}
dirExists = System.IO.Directory.Exists(folder);
if (!dirExists)
{
System.IO.Directory.CreateDirectory(folder);
}
doc.Save(newfile);
foreach (HtmlParseError error in doc.ParseErrors)
{
errors += newfile + " (" + error.Line + "," + error.LinePosition + "): " + error.Reason + "\n";
}
}
}
System.IO.File.WriteAllText("C:\\tmp\\errors.txt", errors);
}
基本上最后发生的事情是它添加了它检测到的许多结束标签,但它不会在它当前读取的文件中关闭,但是标签可能会在不同的文件中结束。
所以我的问题是:是否有可能让 HAP 只做我专门做的更改,而忽略它觉得有自动做的冲动的任何修复?