0

我正在循环一个节点集合。我必须用新元素替换当前节点和当前节点的兄弟节点。

我为此编写了以下代码:

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

            }
}

这是添加新元素并删除传递的节点。但它无法删除节点的下一个兄弟节点。我在这里做错了什么。

请帮忙。

4

1 回答 1

1

正如您所说,添加了新元素,您被明确替换node.NextSibling为。newElement问题可能出在下一个兄弟的类型上。最有可能的是,这是一个文本节点(通常是那些\r\n划分 HTML 节点的节点)。

所以看起来,你的新节点只是替换了文本节点,结果有点出乎意料。因此,如果这确实是一个问题,您可以采取如下解决方法:

// 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();
于 2013-03-01T12:04:28.953 回答