HTML Agility Packを使用して不完全に形成されたHTMLをクリーンアップする方法

asp.net c# html html-agility-pack

質問

私はこの神のひどいコレクションの正規表現を置き換えようとしています。正規表現は現在、不適切な形式のHTMLのブロックを整理するために使用されており、C#のHTMLアジリティパックを見つけました。非常に強力に見えますが、私の心の中で、それに含まれる望ましい機能になるパックをどのように使いたいかの例は見つけられませんでした。私は馬鹿だと確信しており、ドキュメントでは適切な方法を見つけることができません。

説明しましょう...私は次のHTMLを持っていたと言う:

<p class="someclass">
    <font size="3">
        <font face="Times New Roman">
            this is some text
            <a href="somepage.html">Some link</a>
        </font>
    </font>
</p>

...私は次のように見えます:

<p>
    this is some text
    <a href="somepage.html">Some link</a>
</p>

HtmlNode.Remove()メソッドを使用すると、ノードとそのすべての子が削除されます。子供を保存しているノードを削除する方法はありますか?

ありがとう:)

受け入れられた回答

HtmlNodeでは、メソッドRemoveChildに次のオーバーロードがあります。

public HtmlNode RemoveChild(HtmlNode oldChild, bool keepGrandChildren);

これはあなたがそれをする方法です:

HtmlDocument doc = new HtmlDocument();
doc.Load("yourfile.htm");

foreach (HtmlNode font in doc.DocumentNode.SelectNodes("//font"))
{
    font.ParentNode.RemoveChild(font, true);
}

編集: w / keepGrandChildrenの置換オプションが期待どおりに動作しないように見えるので、ここでは別の実装です:

public static HtmlNode RemoveChild(HtmlNode parent, HtmlNode oldChild, bool keepGrandChildren)
{
    if (oldChild == null)
        throw new ArgumentNullException("oldChild");

    if (oldChild.HasChildNodes && keepGrandChildren)
    {
        HtmlNode prev = oldChild.PreviousSibling;
        List<HtmlNode> nodes = new List<HtmlNode>(oldChild.ChildNodes.Cast<HtmlNode>());
        nodes.Sort(new StreamPositionComparer());
        foreach (HtmlNode grandchild in nodes)
        {
            parent.InsertAfter(grandchild, prev);
        }
    }
    parent.RemoveChild(oldChild);
    return oldChild;
}

// this helper class allows to sort nodes using their position in the file.
private class StreamPositionComparer : IComparer<HtmlNode>
{
    int IComparer<HtmlNode>.Compare(HtmlNode x, HtmlNode y)
    {
        return y.StreamPosition.CompareTo(x.StreamPosition);
    }
}

人気のある回答

代わりにAngleSharp https://github.com/AngleSharp/AngleSharpを使用してみることもできます

var parser = new HtmlParser();
var document = parser.Parse(html);

using (var writer = new StringWriter())
{
    document.ToHtml(writer, new PrettyMarkupFormatter());
    return writer.ToString();
}



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ