【问题标题】:Html Agility Pack messing with my javascriptHtml Agility Pack 弄乱了我的 javascript
【发布时间】:2012-02-27 13:42:25
【问题描述】:

我正在使用 Html Agility Pack 在我的文档头部输出一些 javascript。但是在将文档保存到文件系统后,我发现 javascript 源代码已被修改。我猜这是因为 HAP 正在尝试验证我的脚本。有可能防止这种情况吗?正如您在下面看到的,我已经尝试设置不同的选项。

我使用 HAP 的代码:

var htmlDoc = new HtmlDocument();
htmlDoc.OptionCheckSyntax = false;
htmlDoc.OptionAutoCloseOnEnd = false;
htmlDoc.OptionFixNestedTags = false;
htmlDoc.LoadHtml(htmlContent);

HtmlNode headNode = htmlDoc.DocumentNode.SelectSingleNode("//head");
headNode.AddScriptNode(htmlDoc, "../../Scripts/jquery-1.7.1.min.js");

添加脚本标签的扩展方法

public static void AddScriptNode(this HtmlNode headNode, HtmlDocument htmlDoc, string filePath)
{
    string content = "";

    using (StreamReader rdr = File.OpenText(filePath))
    {
        content = rdr.ReadToEnd();
    }
    if(headNode != null)
    {
        HtmlNode scripts = htmlDoc.CreateElement("script");
        scripts.Attributes.Add("type", "text/javascript");
        scripts.InnerHtml = "\n" + content + "\n";
        headNode.AppendChild(scripts);
    }
}

【问题讨论】:

    标签: javascript html-agility-pack


    【解决方案1】:

    我的假设:当使用scripts.InnerHtml AgilityPack 时会尝试将内容解析为 HTML。因此,如果那里有标签,它们将被转换为 HTML 节点。

    为避免这种情况,您应该将<script> 的内容设置为文本。不幸的是,HtmlNode.InnerText 属性是只读的,但有一个解决方法。您可以在<script> 节点中添加一个文本(最好是评论节点)节点:

    if(headNode != null)
    {
        HtmlNode scripts = htmlDoc.CreateElement("script");
        scripts.Attributes.Add("type", "text/javascript");
        scripts.AppendChild(htmlDoc.CreateComment("\n" + content + "\n"));
        headNode.AppendChild(scripts);
    }
    

    您的脚本正文将在此处添加为注释节点(将添加<!---->)。

    【讨论】:

    • 给其他人的注意事项:如果您想在没有 html cmets 的情况下添加脚本标签,您可以执行以下操作scripts.AppendChild(htmlDoc.CreateTextNode(content));
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    相关资源
    最近更新 更多