gpt4 book ai didi

c# - 使用 HtmlAgilityPack 设置 InnerHtml 属性会产生意外结果

转载 作者:太空宇宙 更新时间:2023-11-03 12:47:11 25 4
gpt4 key购买 nike

我正在使用 HtmlAgilityPack 和 C# 来转换旧的 IE 标签以及 Javascript 以与其他浏览器兼容。这是一个例子:

旧代码:

<script for="thisForm" event="onsubmit()" language="JScript">

var Checked = false
var Counter = 0

for (;Counter < this.choice.length; Counter++)
{
if (this.choice[Counter].checked)
{
Checked = true
this.action = this.choice[Counter].value
}
}

if (!Checked)
{
alert ("Please make a selection")
return false
}
</script>

我转换为:

<script ftype="text\JScript">
function thisForm_onsubmit(el)
{
var Checked = false
var Counter = 0

for (;Counter < el.choice.length; counter++)
{
if (el.choice[counter].checked)
{
checked = true
el.action = el.choice[counter].value
}
}

if (!checked)
{
alert ("please make a selection")
return false
}
}
</script>

我上面所做的是从 script 标签中删除 for、event 和 language 属性,添加 type="text/JScript"属性并将 javascript 包装到函数代码中。

我通过简单地添加 HtmlNode 属性然后替换 InnerHtml 属性值来实现。到目前为止,在我遇到上述功能之前,它对我来说工作得很好。不知何故,我没有得到上面的结果,而是得到了以下结果:

<script type="text/JScript">
function thisForm_onsubmit(el)
{
var Checked = false
var Counter = 0

for (;Counter < el.choice.length; counter++)
{
if (el.choice[counter].checked)
{
checked = true
el.action = el.choice[counter].value
}
}

if (!checked)
{
alert ("please make a selection")
return false
}

}
el.choice.length;="" counter++)="" {="" if="" (el.choice[counter].checked)="" {="" checked="true" el.action="el.choice[Counter].value" }="" }="" if="" (!checked)="" {="" alert="" ("please="" make="" a="" selection")="" return="" false="" }="" }=""></ el.choice.length; counter++)
{
if (el.choice[counter].checked)
{
checked = true
el.action = el.choice[counter].value
}
}

if (!checked)
{
alert ("please make a selection")
return false
}

}
></script>

奇怪的是,我分配给 InnerHtml 的文本是正确的,但 scriptNode.InnerHtml 显示不同的值

这是我的 C# 代码:

 if (scriptNode.Attributes["for"] != null)
{
{
if (scriptNode.Attributes["for"] != null)
ctrl = scriptNode.Attributes["for"].Value;

if (scriptNode.Attributes["event"] != null)
evt = scriptNode.Attributes["event"].Value;

if (scriptNode.Attributes["type"] != null)
typ = scriptNode.Attributes["type"].Value;

if (scriptNode.Attributes["language"] != null)
lang = scriptNode.Attributes["language"].Value;
if (scriptNode.InnerHtml != null)
code = scriptNode.InnerHtml;

func_name = ctrl + "_" + evt;
if (ctrl != "window")
new_script = Environment.NewLine + "function " + RemoveBrackets(func_name) + "(el)" + Environment.NewLine;
else
new_script = Environment.NewLine + "function " + AddBrackets(RemoveBrackets(func_name)) + Environment.NewLine;
new_script += "{" + Environment.NewLine;


new_script += "\r\n" + ReplaceThis(sFile, ctrl, evt, code, "this", "el") + "\r\n" + "}" + "\r\n";


//remove for and event attributes
scriptNode.Attributes["for"].Remove();
scriptNode.Attributes["event"].Remove();

//remove depraciated "language" attribute
//and replace it with "type" attribute
if (scriptNode.Attributes["language"] != null)
scriptNode.Attributes["language"].Remove();
if (scriptNode.Attributes["type"] == null)
scriptNode.Attributes.Add("type", "text/" + lang);

//replace old javascript with a function code
//HERE new_script variable contains the correct value but when I check scriptNode.InnerHtml after assignment, it shows the messed up code.

scriptNode.InnerHtml = new_script;

这很奇怪,我似乎找不到解决办法。

我试过使用 HtmlEncode

scriptNode.InnerHtml = HtmlDocument.HtmlEncode(new_script);

并且生成了正确的脚本,如上面第二个示例中指定的那样,但替换了所有 <>&lt;&gt;

结果是:

<script type="text/JScript">
function thisForm_onsubmit(el)
{

var Checked = false
var Counter = 0

for (;Counter &lt; el.choice.length; Counter++)
{
if (el.choice[Counter].checked)
{
Checked = true
el.action = el.choice[Counter].value
}
}

if (!Checked)
{
alert (&quot;Please make a selection&quot;)
return false
}

}
</script>

我考虑过使用 InnerText 而不是 InnerHtml,这更有意义,因为我要更改的并不是真正的 HTML,而是 InnerText 属性是只读的。

谁能阐明为什么会发生这种情况以及是否有解决方法?

最佳答案

修改后的脚本包含特殊字符<我真的怀疑这是造成问题的原因。 <很容易被误解为开始 HTML 标签的第一个字符,尤其是当它通过 InnerHtml 使用时属性(property)。

这是一种可能的解决方法。假设new_script是一个包含修改后的 Javascript 的字符串变量,包括开始和结束标记 ( <script type="text/JScript"></script> )。你可以尝试加载new_script进入一个新的HtmlDocument .然后替换第一个中的旧脚本 HtmlDocument使用第二个 HtmlDocument 的新脚本实例:

.....
var newDoc = new HtmlDocument();
newDoc.LoadHtml(new_script);
var newScript = newDoc.DocumentNode.SelectSingleNode("//script");
scriptNode.ParentNode.ReplaceChild(newScript, script);

dotnetfiddle demo

关于c# - 使用 HtmlAgilityPack 设置 InnerHtml 属性会产生意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36872715/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com