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

这是添加新元素并删除传递的节点。但它没有移除节点的下一个兄弟节点。我哪里做错了?

请帮助。

htmllagility:用一个新元素替换两个节点

显式地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();