Html Agility Pack:スクリプトタグの置き換え

c# html html-agility-pack

質問

私はそのコードでHTML文字列のJQuery scriptタグを置き換えたいです。 src属性が "scripts / jquery-1.9.1.js"に設定されたscriptタグをJQueryの現在のソースコードを含む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>

これは明らかにここで見つけることができるコードではありません

私は何を間違えているのですか?

更新:

1 - InnerHtmlをHTMLとして読み込もうとしているので、 InnerHtml使用できません。

2 - HtmlNode.CreateNodeメソッドは、この "<"を検出するとブレークし、タグの先頭であると認識しますが、そうではありません。

受け入れられた回答

既存のスクリプトノードを削除し、スクリプトのsrcのuriからソースを取得し、新しいものを結果に追加したいので 、解析されたhtmlドキュメントにscriptノードを追加する方法が問題であると考えて、サンプルを作成しましたあなたがしたいことを再現する。

  1. 私はjquery 1.9.1cdnを取り出してローカルファイルに保存しました
  2. 私はそれをHTML文書のscriptノードの下に追加しようとしました

私はHtmlAgilityPackでいくつかの試みを試みましたが、結果として得られるhtmlにはいつもHtmlAgilityPackているガベージがありました。

</div></10></=></9></=8></"></$1></(?!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);

AngleSharp:

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で行う必要がある場合、私の投稿は最終的には役に立たなかった。それ以外の場合は、 AngleSharpを試して問題を解決してください。


人気のある回答

HtmlAgilityPackを使用すると、textNodeを使用できます。

jsNode.AppendChild(doc.CreateTextNode(jsCode));


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ