Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用HTMLAgilityPack编辑数百个asp文件中的html会在不需要时添加关闭标记_C#_Asp.net_Html Agility Pack_Post Processing - Fatal编程技术网

C# 使用HTMLAgilityPack编辑数百个asp文件中的html会在不需要时添加关闭标记

C# 使用HTMLAgilityPack编辑数百个asp文件中的html会在不需要时添加关闭标记,c#,asp.net,html-agility-pack,post-processing,C#,Asp.net,Html Agility Pack,Post Processing,我正在尝试在每个标签中添加一个title属性,该标签对3-400个文件具有alt属性。这些文件中90%是asp文件,其余是aspx/html/++ 我决定用HTMLAgilityPack来修复它,并用C#编写一个小程序来实现这一点。我只是将文件名写入一个.txt文件,然后运行该文本文件来加载每个文件。该程序运行良好,只是HAP不断添加结束括号并修改某些其他标记。 我想我可以接受它,只需将错误写入另一个txt文件,但注意到并非所有这些更改都被写入我设置的字符串中,以保留错误消息(我看到的一些文件已

我正在尝试在每个标签中添加一个title属性,该标签对3-400个文件具有alt属性。这些文件中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);
    }
static void Main(字符串[]args)
{
string[]files=System.IO.File.ReadAllLines(@“filelist.txt”);
字符串错误=”;
HtmlDocument doc=新的HtmlDocument();
布尔-迪尔存在;
doc.OptionCheckSyntax=false;
doc.OptionReadEncoding=false;
doc.OptionOutputOriginalCase=true;
doc.OptionWriteEmptyNodes=true;
HtmlNode.ElementsFlags.Remove(“选项”);
foreach(文件中的字符串文件)
{
单据加载(文件);
if(doc.DocumentNode.SelectNodes(“/@alt”)!=null)
{
foreach(doc.DocumentNode.SelectNodes(“/@alt”)中的HtmlNode节点)
{
如果(!node.GetAttributeValue(“title”,false))
{
foreach(node.Attributes.ToList()中的HtmlAttribute属性)
{
如果(attr.Name==“alt”)
{
node.SetAttributeValue(“title”,属性值);
}
}
}
}
字符串newfile=file.Replace(“C:\\source\\”,“C:\\SLtmp\\”;
字符串[]tmp=newfile.Split('\\');
字符串文件夹=”;
对于(int i=0;i
基本上,最终的结果是,它添加了许多它检测到的结束标记,这些标记在当前读取的文件中没有关闭,但是这些标记可能在不同的文件中结束


因此,我的问题是:是否有可能让HAP只做我特别做的更改,而忽略它感到迫切需要自动做的任何修复?

简短回答:没有。Html敏捷包解析文本并创建内存中的DOM。它并不是真的“修复”东西,它只是没有像以前那样使用错误来编写文本,以及所有原始错误。它输出创建的DOM。我担心:)我想没有办法解决这个问题?它是开源的,所以你可以获取并更改它,但这不是一项容易的任务。根据您的需要,您可以这样做:1)合并打开和关闭文件,2)记住它们拆分的位置,3)使用HAP打开组合,4)按照您想要的方式修改组合,然后再次拆分结果。您能发布一些更改前后html的外观吗?我做了一些相关工作,通过在我的程序中创建一个小类,其中包含:filename、oldvalue和newvalue,在添加标题值之前,我使用HAP将节点复制到oldvalue中,在添加标题值之后,将节点复制到newvalue中。现在的问题是,HAP不仅添加了标题,还修改了节点本身的编写方式。例如,您可以有一个项目,其中一个img标记被写入,节点将以类似的方式结束。所以基本上我需要在HAP中获取原始文本,或者获取其长度。