Html Agility Pack: reemplazo de etiquetas de script

c# html html-agility-pack

Pregunta

Quiero reemplazar la etiqueta de script JQuery en una cadena html por su código. significa eliminar la etiqueta de script con el atributo src establecido en, por ejemplo, "scripts / jquery-1.9.1.js", a una etiqueta de script contiene el código fuente actual de JQuery.

Creo un nuevo nodo usando este código:

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

no importa lo que le haga a jQuerySourceCodeString , siempre se trunca a esto:

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

que claramente no es el código que podemos encontrar aquí.

Qué estoy haciendo mal ?

Actualización:

1 - No puedo usar InnerHtml ya que intenta leerlo como html.

2 - El método HtmlNode.CreateNode se rompe cuando encuentra este "<", cree que es el principio de una etiqueta, pero no lo es.

Respuesta aceptada

Teniendo en cuenta que su problema es cómo agregar un nodo de script usando el documento html analizado ( porque desea eliminar el nodo de script existente, recuperar la fuente del uri del src de script y agregar uno nuevo con los resultados ), creé una muestra para reproducir lo que quieras hacer.

  1. Tomé el cdn para jquery 1.9.1 y lo guardé en un archivo local
  2. Luego intenté adjuntarlo al documento html, bajo un nodo de script

Intenté algunos intentos con HtmlAgilityPack , pero el html resultante siempre tuvo una basura final , pareciendo

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

Luego me di por vencido y probé otro analizador html que (más) uso a menudo - AngleSharp . Con él, obtengo un html resultante correcto.

Aquí están los fragmentos de código para ambos intentos:

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

Conclusión:

Si necesitas hacerlo exclusivamente con HtmlAgilityPack , mi publicación no fue de ninguna ayuda. De lo contrario, pruebe AngleSharp y habrá resuelto su problema.


Respuesta popular

Con HtmlAgilityPack puedes usar textNode:

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


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué