htmllagility:用一个新元素替换两个节点
本文关键字:替换 元素 节点 两个 一个 htmllagility 新元素 | 更新日期: 2023-09-27 18:01:30
我正在遍历一个节点集合。我必须用一个新元素替换当前节点和当前节点的兄弟节点。
我写了下面的代码来做这件事:
private void modifyNodes(IEnumerable<HtmlNode> selectedNodes)
{
foreach (var node in selectedNodes)
{
node.NextSibling.SetAttributeValue("style", "font-weight:bold;padding:2px 2px;");
node.SetAttributeValue("style", "float:right;");
var parentNode = node.ParentNode;
var doc = new HtmlDocument();
var newElement = doc.CreateElement("table");
newElement.SetAttributeValue("style", "background-color:#e4ecf8;width:100%");
var sectionRow = doc.CreateElement("tr");
var headerColumn = doc.CreateElement("td");
headerColumn.AppendChild(node.NextSibling);
var weightColumn = doc.CreateElement("td");
weightColumn.AppendChild(node);
sectionRow.AppendChild(headerColumn);
sectionRow.AppendChild(weightColumn);
newElement.AppendChild(sectionRow);
element.ParentNode.RemoveChild(node);
parentNode.ReplaceChild(newElement, node.NextSibling);
}
}
这是添加新元素并删除传递的节点。但它没有移除节点的下一个兄弟节点。我哪里做错了?
请帮助。
您显式地将node.NextSibling
替换为newElement
,因为您说添加了新元素。问题可能出在下一个兄弟姐妹的类型上。最有可能的是,这是一个文本节点(通常是那些划分HTML节点的'r'n
)。
所以看起来,您的新节点只是替换了文本节点,结果有点出乎意料。因此,如果这确实是一个问题,你可以做这样的解决方案:
// next sibling
var next = node.NextSibling;
// get the first non-text node
while (next != null && next is HtmlTextNode)
next = next.NextSibling;
var newNode = doc.CreateElement(...);
// replace the current node with the new one
current.ParentNode.ReplaceChild(newNode, current);
// remove the next node if it was found
if (next != null)
next.Remove();