HTML Agility Pack возиться с моим JavaScript - PullRequest
3 голосов
/ 27 февраля 2012

Я использую 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);
    }
}

1 Ответ

9 голосов
/ 27 февраля 2012

Мое предположение: при использовании 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);
}

Здесь тело вашего скрипта будет добавлено как узел комментария (<!-- и --> будут добавлены).

...