Html Agility Pack - IDまたはクラス別にタグを削除

c# html-agility-pack

質問

ここに私の単純化されたHTMLがあります:

<html>
  <body>
    <div id="mainDiv">
       <div id="divToRemove"></div>
       <div id="divToKeep"></div>
       <div class="divToRemove"></div>
       <div class="divToRemove"></div>
    </div>
  </body>
</html>

私はdivやdivを "divToRemove"という名前のdivで削除したいので、 "mainDiv"というdiv(HtmlNode内)だけを選択したいと思います。

結果は次のとおりです。

   <div id="mainDiv">
       <div id="divToKeep"></div>
   </div>

どのように私はHTMLのアジリティパックを使用してそれを行うことができますか?

ありがとう!

受け入れられた回答

次のコードは、 このHtml Agility Packフォーラムページからニーズに合わせて変更されています。本質的には、すべてのdivを取得し、それらをループし、クラスまたはIDを調べて一致するものを探します。それがあれば削除してください。

var divs = htmldoc.DocumentNode.SelectNodes("//div");
if (divs != null)
{
    foreach (var tag in divs)
    {
        if (tag.Attributes["class"] != null && string.Compare(tag.Attributes["class"].Value, "divToRemove", StringComparison.InvariantCultureIgnoreCase) == 0)
        {
            tag.Remove();
        } else if(tag.Attributes["id"] != null && string.Compare(tag.Attributes["id"].Value, "divToRemove", StringComparison.InvariantCultureIgnoreCase) == 0) {
            tag.Remove();
        }
    }
}

また、これらのif文を1つの大きなif文に組み合わせることもできますが、これは答えの方が良いと思いました。

最後に、探していたノードを選択してください...

var mainDiv = htmldoc.DocumentNode.SelectSingleNode("//div[@id='mainDiv']");

人気のある回答

個人的には、私はHtmlAgilityPackのLinqメソッドを使用することを好みます。選択は長くなりますが、比較的簡単です。適切なIDおよび/またはクラスを持つノードを選択し、その上でRemove()メソッドを呼び出します。

foreach (var node in doc.DocumentNode.Descendants("div")
    .Where(n => n.Id.Equals("divToRemove", StringComparison.InvariantCultureIgnoreCase) 
        || n.GetAttributeValue("class", string.Empty).Equals("divToRemove", StringComparison.InvariantCultureIgnoreCase)))
    node.Remove();
HtmlNode mainNode = doc.DocumentNode.Descendants("div").Where(n => n.Id.Equals("mainDiv", StringComparison.InvariantCultureIgnoreCase).First();


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