4

これが私の簡略化された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>

「divToRemove」という名前のIDまたはクラスのdivを削除してから、(HtmlNode内の)「mainDiv」という名前のdivのみを選択したいと思います。

結果は次のようになります。

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

Html Agility Packを使用してそれを行うにはどうすればよいですか?

ありがとう!

4

2 に答える 2

6

次のコードは、このHtmlAgilityPackフォーラムページをニーズに合わせて調整したものです。基本的に、すべての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']");
于 2012-07-07T03:05:17.977 に答える
1

個人的には、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();
于 2012-07-07T04:02:49.553 に答える