我想用新节点替换节点。如何获得节点的确切位置并完全替换?
我已尝试过以下操作,但我无法弄清楚如何获取节点的索引或调用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( )
}
答案 0 :(得分:44)
要创建新节点,请使用HtmlNode.CreateNode()
工厂方法,不要直接使用构造函数。
此代码应该适合您:
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);
}
请注意,我们需要在查询上调用ToList()
,我们将修改文档,这样如果不这样做就会失败。
如果您希望替换为此字符串:
"some text <b>node</b> <strong>another node</strong>"
问题是它不再是单个节点而是一系列节点。您可以使用HtmlNode.CreateNode()
解析它,但最后,您只是引用序列的第一个节点。您需要使用父节点进行替换。
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);
}
答案 1 :(得分:0)
我正在为新生成的节点使用HtmlDocument.DocumentNode
。
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);
}
答案 2 :(得分:0)
已实现以下解决方案以实现相同的目的。
var htmlStr = "<b>bold_one</b><div class='LatestLayout'><div class='olddiv'><strong>strong</strong></div></div><b>bold_two</b>";
var htmlDoc = new HtmlDocument();
HtmlDocument document = new HtmlDocument();
document.Load(htmlStr);
htmlDoc.DocumentNode.SelectSingleNode("//div[@class='olddiv']").Remove();
htmlDoc.DocumentNode.SelectSingleNode("//div[@class='LatestLayout']").PrependChild(newChild)
htmlDoc.Save(FilePath); // FilePath .html file with full path if need to save file.
因此选择一个对象并删除相应的HTML对象
并附加为智利。各自的对象。