Html n'est pas mis à jour avec Html Agility Pack

c# html html-agility-pack

Question

J'essaie de supprimer l'élément img et map d'un morceau de HTML.

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);

var oldHtml = doc.DocumentNode.InnerHtml;

if (doc.DocumentNode.SelectNodes("//img[@usemap]") != null)
{
    HtmlNode img = doc.DocumentNode.SelectSingleNode("//img[@usemap]");
    img.ParentNode.RemoveChild(img);
}

if (doc.DocumentNode.SelectNodes("//map") != null)
{
    HtmlNode map = doc.DocumentNode.SelectSingleNode("//map");
    map.ParentNode.RemoveChild(map);
}

var newHtml = doc.DocumentNode.InnerHtml;

Le newHtml contient toujours les éléments img et map. Dois-je faire autre chose avant que le code HTML ne soit mis à jour?

Voici le code HTML que j'essaie de supprimer:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);

var oldHtml = doc.DocumentNode.InnerHtml;

if (doc.DocumentNode.SelectNodes("//img[@usemap]") != null)
{
    HtmlNode img = doc.DocumentNode.SelectSingleNode("//img[@usemap]");
    img.ParentNode.RemoveChild(img);
}

if (doc.DocumentNode.SelectNodes("//map") != null)
{
    HtmlNode map = doc.DocumentNode.SelectSingleNode("//map");
    map.ParentNode.RemoveChild(map);
}

var newHtml = doc.DocumentNode.InnerHtml;

Lorsque je débogue les éléments img et map sont trouvés, mais l'appel de RemoveChild ne modifie pas le code HTML. Aussi, lorsque j'essaie de modifier un attribut ou quelque chose d'autre, rien ne se passe.

Réponse populaire

Je viens de découvrir que le problème avec le pack HTML Agility est que vous ne pouvez demander qu'une .InnerHtml fois. Après cela, il ne sera pas mis à jour. Vous le demandez deux fois:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);

var oldHtml = doc.DocumentNode.InnerHtml;

if (doc.DocumentNode.SelectNodes("//img[@usemap]") != null)
{
    HtmlNode img = doc.DocumentNode.SelectSingleNode("//img[@usemap]");
    img.ParentNode.RemoveChild(img);
}

if (doc.DocumentNode.SelectNodes("//map") != null)
{
    HtmlNode map = doc.DocumentNode.SelectSingleNode("//map");
    map.ParentNode.RemoveChild(map);
}

var newHtml = doc.DocumentNode.InnerHtml;

Si vous vous débarrassez de cette ligne:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);

var oldHtml = doc.DocumentNode.InnerHtml;

if (doc.DocumentNode.SelectNodes("//img[@usemap]") != null)
{
    HtmlNode img = doc.DocumentNode.SelectSingleNode("//img[@usemap]");
    img.ParentNode.RemoveChild(img);
}

if (doc.DocumentNode.SelectNodes("//map") != null)
{
    HtmlNode map = doc.DocumentNode.SelectSingleNode("//map");
    map.ParentNode.RemoveChild(map);
}

var newHtml = doc.DocumentNode.InnerHtml;

Ça devrait marcher. Cela semble être un bogue aléatoire avec HtmlAgilityPack.

La solution de Sniffdk fonctionne car il ne reçoit qu'une .OuterHtml fois .OuterHtml . Les gars de HtmlUtilityPack ont ​​besoin de résoudre ce problème.




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