Html Agility Pack在HtmlDocument加载时创建不相关的字符

时间:2016-05-18 10:24:46

标签: c# razor html-agility-pack

我正在使用asp.net mvc4 C#进行项目。我想改变一些html元素

属性由c#表示宽度,高度等。我有一个简单的(_Layout.cshtml)文件。

<html>
    <head>
        <link href="@Url.Content("file.css")" rel="stylesheet" type="text/css" />
        <link href="@Url.Content("html.css")" rel="stylesheet" type="text/css" />
        <body>
        </body>
    </head> 
</html>

所以我使用html agility pack加载并保存这个文件

HtmlDocument doc= new HtmlDocument();

doc.load("_Layout.cshtml");
List<string> linklist = new List<string>();
scriptlist.Add("html.css");
scriptlist.Add("Html1.css");
HtmlNodeCollection _node = doc.DocumentNode.SelectNodes("//link");

foreach (HtmlNode Node in _node)
{
    foreach (var sName in linklist)
    {
        if (Node.OuterHtml.Contains(Name.ToLower()))
        {
            Console.WriteLine(Node.OuterHtml);
            var linkNode = HtmlNode.CreateNode("<link href=" + "@Url.Content(" + '"' + "~/links/../" + Name + '"' + ")" + "/>");
            HeadNode.ReplaceChild(linkNode, Node);
        }
    }                
}

doc.save("_Layout.cshtml");

保存文件输出后就像这样

<html>
    <head>
        <link href="@Url.Content("file.css")"="" rel="stylesheet" type="text/css" />

        <link href="@Url.Content("html.css")" />
        <body>
        </body>
    </head>
</html>

在(link href)中保存一些额外的字符,例如=“

我怎样才能避免这个问题..对于asp.net mvc,c#中是否有解析html的其他解决方案。

其实我想替换新路径来给出href属性

1 个答案:

答案 0 :(得分:1)

您的标记作为Razor模板有效,但不是HTML,HtmlAgilityPack无法识别特定于剃刀的语法。具体来说,在HTML视点中,.cshtml中href属性值中的双引号字符与用作属性值分隔符的外部双引号冲突。这个无效的HTML会导致HtmlAgilityPack出现意外行为。

作为一种变通方法,您可以在Razor模板中使用单引号作为属性值分隔符,以避免上述冲突:

<html>
    <head>
        <link href='@Url.Content("file.css")' rel="stylesheet" type="text/css" />
        <link href='@Url.Content("html.css")' rel="stylesheet" type="text/css" />
        <body>
        </body>
    </head> 
</html>