4

次のように note.Remove() だけで要素を簡単に削除できます。

HtmlDocument html = new HtmlDocument();

html.Load(Server.MapPath(@"~\Site\themes\default\index.cshtml"));

foreach (var item in html.DocumentNode.SelectNodes("//removeMe"))
{
    item.Remove();
}

ただし、それにより innerHtml も削除されます。タグのみを削除し、innerHtml を保持したい場合はどうすればよいですか?

例:

<ul>
    <removeMe>
        <li>
            <a href="#">Keep me</a>
        </li>
    </removeMe>
</ul>

どんな助けでも大歓迎です:)

4

10 に答える 10

22
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);

var node = doc.DocumentNode.SelectSingleNode("//removeme");
node.ParentNode.RemoveChild(node, true);
于 2012-08-23T13:58:54.297 に答える
3

削除しようとしている要素内にテキストが含まれている可能性があるユーザー向けの bool KeepGrandChildren 実装には問題があります。removeme タグにテキストが含まれていた場合、そのテキストも削除されます。たとえば<removeme>text<p>more text</p></removeme><p>more text</p>

これを試して:

private static void RemoveElementKeepText(HtmlNode node)
    {
        //node.ParentNode.RemoveChild(node, true);
        HtmlNode parent = node.ParentNode;
        HtmlNode prev = node.PreviousSibling;
        HtmlNode next = node.NextSibling;

        foreach (HtmlNode child in node.ChildNodes)
        {
            if (prev != null)
                parent.InsertAfter(child, prev);
            else if (next != null)
                parent.InsertBefore(child, next);
            else
                parent.AppendChild(child);

        }
        node.Remove();
    }
于 2012-09-18T16:53:57.160 に答える
3

これはうまくいくはずです:

foreach (var item in doc.DocumentNode.SelectNodes("//removeMe"))
{
    if (item.PreviousSibling == null)
    {
        //First element -> so add it at beginning of the parent's innerhtml
        item.ParentNode.InnerHtml = item.InnerHtml + item.ParentNode.InnerHtml;
    }
    else
    {
        //There is an element before itemToRemove -> add the innerhtml after the previous item
        foreach(HtmlNode node in item.ChildNodes){
            item.PreviousSibling.ParentNode.InsertAfter(node, item.PreviousSibling);
        }
    }
    item.Remove();
}
于 2012-08-23T13:55:01.787 に答える
1

簡単な方法があります:

 element.InnerHtml = element.InnerHtml.Replace("<br>", "{1}"); 
 var innerTextWithBR = element.InnerText.Replace("{1}", "<br>");
于 2013-03-07T19:42:08.793 に答える
0

これはどう?

var removedNodes = document.SelectNodes("//removeme");
if(removedNodes != null)
    foreach(var rn in removedNodes){
        HtmlTextNode innernodes =document.CreateTextNode(rn.InnerHtml);
        rn.ParnetNode.ReplaceChild(innernodes, rn);
    }
于 2013-04-13T10:43:41.667 に答える
0

おそらく、これはあなたが探しているものかもしれませんか?

foreach (HtmlNode node in html.DocumentNode.SelectNodes("//removeme"))
{
    HtmlNodeCollection children = node.ChildNodes; //get <removeme>'s children
    HtmlNode parent = node.ParentNode; //get <removeme>'s parent
    node.Remove(); //remove <removeme>
    parent.AppendChildren(children); //append the children to the parent
}

編集:LBの答えはずっときれいです。彼と一緒に行こう!

于 2012-08-23T13:59:55.973 に答える
-3

正規表現を使用して行うことができますか、それとも htmlagilitypack で行う必要がありますか?

string html = "<ul><removeMe><li><a href="#">Keep me</a></li></removeMe></ul>";

html = Regex.Replace(html, "<removeMe.*?>", "", RegexOptions.Compiled);
html = Regex.Replace(html, "</removeMe>", "", RegexOptions.Compiled);
于 2012-08-23T13:32:38.180 に答える