HTML Agility Pack - Problème lors de la sélection d'une balise de sélection HTML avec les balises d'option dans

.net c# dom html-agility-pack

Question

J'utilise HTML Agility Pack pour sélectionner un élément et renvoyer cet élément et tout ce qu'il contient à partir d'une chaîne HTML chargée. Lors du test de mon code, je l'ai exécuté à l'aide de l'exemple de balise select de w3schools:

<select name="cars">
  <option value="volvo">Volvo XC90</option>
  <option value="saab">Saab 95</option>
  <option value="mercedes">Mercedes SLK</option>
  <option value="audi">Audi TT</option>
</select>

Lorsque j'essaie de sélectionner et de renvoyer ceci avec le pack d'agilité HTML, je reçois (balises de fermeture d'option supprimées):

<select name="cars">
  <option value="volvo">Volvo XC90
  <option value="saab">Saab 95
  <option value="mercedes">Mercedes SLK
  <option value="audi">Audi TT
</select>

J'ai donc fait quelques recherches ici et trouvé une instruction pour ajouter la ligne: HtmlNode.ElementsFlags.Remove ("option");

Je l'ai fait et maintenant je reçois (le texte des options est déplacé en dehors des balises option):

<select name="cars">
  <option value="volvo"></option>Volvo XC90
  <option value="saab"></option>Saab 95
  <option value="mercedes"></option>Mercedes SLK
  <option value="audi"></option>Audi TT
</select>

Je voudrais que la sortie corresponde au HTML original. Que dois-je faire pour l'obtenir?

Je jouais aussi avec les OptionWriteEmptyNodes car lorsque je testais avec les balises d’entrée, leur fermeture automatique était supprimée. Je l'ai commenté maintenant pour m'assurer que cela n'affectait pas ce problème.

Voici mon code .NET C #:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(content);
HtmlNode.ElementsFlags.Remove("option"); // otherwise, the closing tag is removed.

//doc.OptionWriteEmptyNodes = true;

var nodes = doc.DocumentNode.SelectNodes("//select");

if (nodes == null)
    return "Not found";
else
    return nodes[0].OuterHtml;

Réponse acceptée

Vous devez définir le champ ElementsFlag pour que la balise option soit opérationnelle.

HtmlNode.ElementsFlags["option"] = HtmlElementFlag.Closed;

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

ce qui devrait retourner votre code HTML d'origine.

Je pense que la raison pour laquelle HtmlAgilityPack se comporte de cette façon est que <option> -tag est ironiquement une balise optionnelle en HTML qui ne nécessite pas de balise de fermeture.

Extrait de la documentation de la classe HtmlNode et de son champ ElementsFlags :

Obtient une collection d'indicateurs qui définissent des comportements spécifiques pour des nœuds d'élément spécifiques. La table contient une liste DictionaryEntry avec le nom de balise en minuscule comme clé et une combinaison de HtmlElementFlags comme valeur.

Regardez plus loin dans les HtmlElementFlag :

Vide - Le nœud est vide. META ou IMG sont des exemples de tels nœuds. Fermé - Le nœud sera automatiquement fermé lors de l'analyse.

Vous pouvez afficher le code source de la classe HtmlNode pour voir quelles autres balises sont considérées comme "spécifiques".



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi