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

新しい要素が追加されたと言ったように、明示に に置き換えられます。問題は、次の兄弟のタイプにある可能性があります。ほとんどの場合、これはテキスト ノードです (非常に多くの場合、HTML ノードを分割するノード)。node.NextSiblingnewElement\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();
于 2013-03-01T12:04:28.953 に答える