Html Agility Pack: rimuovi tag per ID o classe

c# html-agility-pack

Domanda

Ecco il mio codice HTML semplificato:

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

Voglio rimuovere i div con ID o classe denominati "divToRemove" e quindi voglio selezionare solo il div chiamato "mainDiv" (in un HtmlNode).

I risultati dovrebbero essere:

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

Come posso farlo utilizzando Html Agility Pack?

Grazie!

Risposta accettata

Il seguente codice è adattato da questa pagina del forum Agil Pack di Html per soddisfare le tue esigenze. Essenzialmente, prenderemo tutti i div, quindi li analizzeremo e controlleremo la loro classe o il loro id per una corrispondenza. Se è lì rimuovilo.

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();
        }
    }
}

Puoi anche combinare queste affermazioni if ​​in una sola istruzione if, ma ho pensato che fosse meglio leggere per la risposta.

Infine, seleziona il nodo che stavi cercando ...

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

Risposta popolare

Personalmente, preferisco usare i metodi Linq di HtmlAgilityPack. La selezione sarà lunga, ma relativamente semplice: basta selezionare i nodi con l'ID corretto e / o la classe e quindi chiamare il metodo Remove() su di esso.

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();


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché