Html 敏捷包:替换脚本标签
Html Agility Pack: replacing script tags
我想用它的代码替换 html 字符串中的 JQuery script
标签。意味着将 src
属性设置为例如 "scripts/jquery-1.9.1.js" 的 script
标签删除到包含 JQuery.[=21= 当前源代码的 script
标签]
我使用此代码创建了一个新节点:
HtmlNode node = new HtmlNode(HtmlNodeType.Element, htmlDocument, index);
node.Name = "script";
node.PrependChild(HtmlNode.CreateNode(jQuerySourceCodeString));
无论我对 jQuerySourceCodeString
做什么,它总是被截断为:
<script>/*!
* jQuery JavaScript Library v1.9.1
* http://jquery.com/
*
* Includes Sizzle.js
* http://sizzlejs.com/
*
* Copyright 2005, 2012 jQuery Foundation, Inc. and other contributors
* Released under the MIT license
* http://jquery.org/license
*
* Date: 2013-2-4
*/
(function( window, undefined ) {
// Can't do this because several apps including ASP.NET trace
// the stack via arguments.caller.callee and Firefox dies if
// you try to trace through "use strict" call chains. (#13335)
// Support: Firefox 18+
//"use strict";
var
// The deferred used on DOM ready
readyList,
// A central reference to the root jQuery(document)
rootjQuery,
// Support: IE</script>
这显然不是我们能找到的代码here
我做错了什么?
更新:
1 - 我无法使用 InnerHtml
,因为它试图将其读取为 html。
2 - HtmlNode.CreateNode
方法在发现这个“<”时中断,它认为它是标记的开头,但事实并非如此。
考虑到您的问题是如何将 script
节点附加到已解析的 html 文档(因为您想删除现有的脚本节点,请从脚本 src 的 uri,并附加一个新的结果),我创建了一个示例来重现你想要做的事情。
- 我把
cdn
for jquery 1.9.1保存到本地文件
- 然后我尝试将其附加到 html 文档,在
script
节点下
我用 HtmlAgilityPack
尝试了一些尝试,但结果 html 总是有一个 尾随垃圾 ,看起来像
</div></10></=></9></=8></"></></(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^></(?:"></use></9></table></tfoot></thead></tbody></table></tbody></9></=></"></[\w\w]+></tag></\></([\w-]+)\s*\></number></9></9></1.9.8+></10></=8></script>
然后我放弃并尝试了我(更多)经常使用的另一个 html 解析器 - AngleSharp
。
有了它,我得到了正确的结果 html.
以下是两次尝试的代码片段:
HtmlAgilityPack:
string html = @"
<html>
<head><title>SO Question</title></head>
<body>
<div>
text text text
</div>
</body>
<script>
var a = 10;
</script>
</html>
";
var jsCode = File.ReadAllText("D:/jquery-1.12.4.js", Encoding.UTF8);
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
HtmlNode jsNode = new HtmlNode(HtmlNodeType.Element, doc, 0);
jsNode.Name = "script";
jsNode.InnerHtml = jsCode;
doc.DocumentNode.InsertAfter(jsNode, doc.DocumentNode.SelectSingleNode("body"));
File.WriteAllText("D:/jsCodeOut.html", doc.DocumentNode.InnerHtml);
锐角:
string html = @"
<html>
<head><title>SO Question</title></head>
<body>
<div>
text text text
</div>
</body>
<script>
var a = 10;
</script>
</html>
";
var jsCode = File.ReadAllText("D:/jquery-1.12.4.js", Encoding.UTF8);
HtmlParser hp = new HtmlParser();
var parsedHtml = hp.Parse(html);
var scriptNode = parsedHtml.CreateElement("script");
scriptNode.InnerHtml = jsCode;
parsedHtml.DocumentElement.AppendChild(scriptNode);
File.WriteAllText("D:/angleSharpOutput.html", parsedHtml.DocumentElement.InnerHtml);
结论:
如果你需要专门用 HtmlAgilityPack
来做,那么我的 post 最终没有帮助。否则,尝试 AngleSharp
即可解决您的问题。
使用 HtmlAgilityPack
你可以使用 textNode:
jsNode.AppendChild(doc.CreateTextNode(jsCode));
我想用它的代码替换 html 字符串中的 JQuery script
标签。意味着将 src
属性设置为例如 "scripts/jquery-1.9.1.js" 的 script
标签删除到包含 JQuery.[=21= 当前源代码的 script
标签]
我使用此代码创建了一个新节点:
HtmlNode node = new HtmlNode(HtmlNodeType.Element, htmlDocument, index);
node.Name = "script";
node.PrependChild(HtmlNode.CreateNode(jQuerySourceCodeString));
无论我对 jQuerySourceCodeString
做什么,它总是被截断为:
<script>/*!
* jQuery JavaScript Library v1.9.1
* http://jquery.com/
*
* Includes Sizzle.js
* http://sizzlejs.com/
*
* Copyright 2005, 2012 jQuery Foundation, Inc. and other contributors
* Released under the MIT license
* http://jquery.org/license
*
* Date: 2013-2-4
*/
(function( window, undefined ) {
// Can't do this because several apps including ASP.NET trace
// the stack via arguments.caller.callee and Firefox dies if
// you try to trace through "use strict" call chains. (#13335)
// Support: Firefox 18+
//"use strict";
var
// The deferred used on DOM ready
readyList,
// A central reference to the root jQuery(document)
rootjQuery,
// Support: IE</script>
这显然不是我们能找到的代码here
我做错了什么?
更新:
1 - 我无法使用 InnerHtml
,因为它试图将其读取为 html。
2 - HtmlNode.CreateNode
方法在发现这个“<”时中断,它认为它是标记的开头,但事实并非如此。
考虑到您的问题是如何将 script
节点附加到已解析的 html 文档(因为您想删除现有的脚本节点,请从脚本 src 的 uri,并附加一个新的结果),我创建了一个示例来重现你想要做的事情。
- 我把
cdn
for jquery 1.9.1保存到本地文件 - 然后我尝试将其附加到 html 文档,在
script
节点下
我用 HtmlAgilityPack
尝试了一些尝试,但结果 html 总是有一个 尾随垃圾 ,看起来像
</div></10></=></9></=8></"></></(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^></(?:"></use></9></table></tfoot></thead></tbody></table></tbody></9></=></"></[\w\w]+></tag></\></([\w-]+)\s*\></number></9></9></1.9.8+></10></=8></script>
然后我放弃并尝试了我(更多)经常使用的另一个 html 解析器 - AngleSharp
。
有了它,我得到了正确的结果 html.
以下是两次尝试的代码片段:
HtmlAgilityPack:
string html = @"
<html>
<head><title>SO Question</title></head>
<body>
<div>
text text text
</div>
</body>
<script>
var a = 10;
</script>
</html>
";
var jsCode = File.ReadAllText("D:/jquery-1.12.4.js", Encoding.UTF8);
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
HtmlNode jsNode = new HtmlNode(HtmlNodeType.Element, doc, 0);
jsNode.Name = "script";
jsNode.InnerHtml = jsCode;
doc.DocumentNode.InsertAfter(jsNode, doc.DocumentNode.SelectSingleNode("body"));
File.WriteAllText("D:/jsCodeOut.html", doc.DocumentNode.InnerHtml);
锐角:
string html = @"
<html>
<head><title>SO Question</title></head>
<body>
<div>
text text text
</div>
</body>
<script>
var a = 10;
</script>
</html>
";
var jsCode = File.ReadAllText("D:/jquery-1.12.4.js", Encoding.UTF8);
HtmlParser hp = new HtmlParser();
var parsedHtml = hp.Parse(html);
var scriptNode = parsedHtml.CreateElement("script");
scriptNode.InnerHtml = jsCode;
parsedHtml.DocumentElement.AppendChild(scriptNode);
File.WriteAllText("D:/angleSharpOutput.html", parsedHtml.DocumentElement.InnerHtml);
结论:
如果你需要专门用 HtmlAgilityPack
来做,那么我的 post 最终没有帮助。否则,尝试 AngleSharp
即可解决您的问题。
使用 HtmlAgilityPack
你可以使用 textNode:
jsNode.AppendChild(doc.CreateTextNode(jsCode));