Remplacement d'un nœud à l'aide de HtmlAgilityPack en envoyant une erreur étrange

c# html html-agility-pack parsing

Question

J'ai une page Web qui affiche une table que l'utilisateur peut modifier. Une fois les modifications apportées, je souhaite enregistrer le tableau en tant que fichier .html que je pourrai convertir ultérieurement en image. Je le fais en surchargeant la méthode de rendu. Cependant, je souhaite supprimer deux boutons et une liste déroulante de la version finale afin d'obtenir le tableau par lui-même. Voici le code que j'essaye actuellement:

protected override void Render(HtmlTextWriter writer)
{
    using (HtmlTextWriter htmlwriter = new HtmlTextWriter(new StringWriter()))
    {
        base.Render(htmlwriter);
        string renderedContent = htmlwriter.InnerWriter.ToString();
        string output = renderedContent.Replace(@"<input type=""submit"" name=""viewReport"" value=""View Report"" id=""viewReport"" />", "");
        output = output.Replace(@"<input type=""submit"" name=""redoEdits"" value=""Redo Edits"" id=""redoEdits"" />", "");

        var doc = new HtmlDocument();
        doc.LoadHtml(output);

        var query = doc.DocumentNode.Descendants("select");
        foreach (var item in query.ToList())
        {
            var newNodeStr = "<div></div>";
            var newNode = HtmlNode.CreateNode(newNodeStr);
            item.ParentNode.ReplaceChild(newNode, item);
        }

        File.WriteAllText(currDir + "\\outputFile.html", output);

        writer.Write(renderedContent);
    }
}

Lorsque j'ai adapté cette solution trouvée dans une autre SO poster sur le remplacement des noeuds avec HtmlAgilityPack:

var htmlStr = "<b>bold_one</b><strong>strong</strong><b>bold_two</b>";
var doc = new HtmlDocument();
doc.LoadHtml(htmlStr);

var query = doc.DocumentNode.Descendants("b");
foreach (var item in query.ToList())
{
    var newNodeStr = "<foo>bar</foo>";
    var newNode = HtmlNode.CreateNode(newNodeStr);
    item.ParentNode.ReplaceChild(newNode, item);
}

et voici le code HTML que je tente de modifier:

<select name="Archives" onchange="javascript:setTimeout(&#39;__doPostBack(\&#39;Archives\&#39;,\&#39;\&#39;)&#39;, 0)" id="Archives" style="width:200px;">
    <option selected="selected" value="Dashboard_Jul-2012">Dashboard_Jul-2012</option>
    <option value="Dashboard_Jun-2012">Dashboard_Jun-2012</option>
</select>

Les deux appels à Remplacer fonctionnent comme prévu et suppriment les boutons. Cependant cette ligne:

var query = doc.DocumentNode.Descendants("select");

jette cette erreur:

Method not found: 'Int32 System.Environment.get_CurrentManagedThreadId()'.

Tout conseil est apprécié.

Cordialement.

Réponse acceptée

On dirait que vous utilisez la version .Net 4.5 du pack Agility dans un projet ciblant .Net ou une version inférieure, il vous suffit de changer la référence de la Dll en celle compilée pour votre version de Framework ou votre projet en .Net 4.5 (Si vous utilisez VS 2012, c’est le cas).



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi