HtmlAgilityPack remplace le noeud

c# html-agility-pack

Question

Je veux remplacer un noeud par un nouveau noeud. Comment puis-je obtenir la position exacte du nœud et effectuer un remplacement complet?

J'ai essayé ce qui suit, mais je ne peux pas comprendre comment obtenir l'index du nœud ou le nœud parent sur lequel appeler ReplaceChild() .

string html = "<b>bold_one</b><strong>strong</strong><b>bold_two</b>";
HtmlDocument document = new HtmlDocument();
document.LoadHtml(html);

var bolds = document.DocumentNode.Descendants().Where(item => item.Name == "b");

foreach (var item in bolds)
{

    string newNodeHtml = GenerateNewNodeHtml();
    HtmlNode newNode = new HtmlNode(HtmlNodeType.Text, document, ?);
    item.ParentNode.ReplaceChild( )
}

Réponse acceptée

Pour créer un nouveau nœud, utilisez la méthode de fabrique HtmlNode.CreateNode() , n'utilisez pas directement le constructeur.

Ce code devrait fonctionner pour vous:

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

Notez que nous devons appeler ToList() sur la requête, nous allons modifier le document pour qu'il échoue si nous ne le faisons pas.


Si vous souhaitez remplacer par cette chaîne:

"some text <b>node</b> <strong>another node</strong>"

Le problème est qu'il ne s'agit plus d'un seul nœud mais d'une série de nœuds. Vous pouvez l’analyser HtmlNode.CreateNode() utilisant HtmlNode.CreateNode() mais au final, vous ne faites que référencer le premier nœud de la séquence. Vous devrez remplacer en utilisant le nœud parent.

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 newNodesStr = "some text <b>node</b> <strong>another node</strong>";
    var newHeadNode = HtmlNode.CreateNode(newNodesStr);
    item.ParentNode.ReplaceChild(newHeadNode.ParentNode, item);
}

Réponse populaire

J'utilise HtmlDocument.DocumentNode pour le nœud nouvellement généré.

string html = "<b>bold_one</b><strong>strong</strong><b>bold_two</b>";
HtmlDocument document = new HtmlDocument();
document.LoadHtml(html);
var bolds = document.DocumentNode.Descendants().Where(item => item.Name == "b");
foreach (var item in bolds)
{
    string newNodeHtml = GenerateNewNodeHtml();
    var nodeDocument = new HtmlDocument();
    nodeDocument.LoadHtml(newNodeHtml);
    item.ParentNode.ReplaceChild(nodeDocument.DocumentNode);
}


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