parser parse htmlagilitypack agility c# html-agility-pack

c# - parse - htmlagilitypack selectnodes



HtmlAgilityPack reemplazar nodo (2)

Estoy usando HtmlDocument.DocumentNode para el nodo recién generado.

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

Quiero reemplazar un nodo con un nuevo nodo. ¿Cómo puedo obtener la posición exacta del nodo y realizar una sustitución completa?

He intentado lo siguiente, pero no puedo descubrir cómo obtener el índice del nodo o a qué nodo primario llamar 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( ) }


Para crear un nuevo nodo, use el método de fábrica HtmlNode.CreateNode() , no use el constructor directamente.

Este código debería funcionar para usted:

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

Tenga en cuenta que debemos llamar a ToList() en la consulta, estaremos modificando el documento para que falle si no lo hacemos.

Si desea reemplazar con esta cadena:

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

El problema es que ya no es un solo nodo sino una serie de nodos. Puedes analizarlo bien usando HtmlNode.CreateNode() pero al final, solo estás haciendo referencia al primer nodo de la secuencia. Necesitará reemplazar utilizando el nodo padre.

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