Html Agility Pack: remplacement des balises de script

c# html html-agility-pack

Question

Je veux remplacer la balise de script JQuery dans une chaîne html par son code. signifie que supprimer la balise de script avec l'attribut src défini, par exemple, sur "scripts / jquery-1.9.1.js" en balise de script contenant le code source actuel de JQuery.

Je crée un nouveau noeud en utilisant ce code:

HtmlNode node = new HtmlNode(HtmlNodeType.Element, htmlDocument, index);
node.Name = "script";
node.PrependChild(HtmlNode.CreateNode(jQuerySourceCodeString));

peu importe ce que je fais au jQuerySourceCodeString il est toujours tronqué à ceci:

<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>

ce qui est clairement pas le code que nous pouvons trouver ici

Qu'est-ce que je fais mal ?

Mettre à jour :

1 - Je ne peux pas utiliser InnerHtml car il essaie de le lire en tant que HTML.

2 - La méthode HtmlNode.CreateNode s'interrompt lorsqu'elle trouve ce "<", elle pense que c'est le début d'une balise, mais ce n'est pas le cas.

Réponse acceptée

Considérant que votre problème est de savoir comment ajouter un noeud de script utilisant le document HTML analysé ( parce que vous voulez supprimer le noeud de script existant, récupérer le source du script sri de l'URI et en ajouter un nouveau avec les résultats ), j'ai créé un exemple reproduire ce que vous voulez faire.

  1. J'ai pris le cdn pour jquery 1.9.1 et l'ai sauvegardé dans un fichier local
  2. J'ai ensuite essayé de l'ajouter au document HTML, sous un noeud de script

J'ai essayé quelques tentatives avec HtmlAgilityPack , mais le HTML résultant a toujours eu une poubelle de fuite , ressemblant à

</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>

J'ai ensuite abandonné et essayé un autre analyseur syntaxique HTML que j'utilise (plus) souvent - AngleSharp . Avec cela, je reçois un résultat HTML correct.

Voici les extraits de code pour les deux tentatives:

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);

Conclusion:

Si vous avez besoin de le faire exclusivement avec HtmlAgilityPack , alors mon message n’a finalement aucune aide. Sinon, essayez AngleSharp et vous avez résolu votre problème.


Réponse populaire

Avec HtmlAgilityPack vous pouvez utiliser textNode:

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


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow