HtmlAgilityPack Drops Tags de fin d'option

html html-agility-pack parsing

Question

J'utilise HtmlAgilityPack. Je crée un HtmlDocument et un LoadHtml avec la chaîne suivante:

<select id="foo_Bar" name="foo.Bar"><option selected="selected" value="1">One</option><option value="2">Two</option></select>

Cela fait des choses inattendues. Premièrement, il donne deux erreurs d’analyseur, EndTagNotRequired. Deuxièmement, le nœud de sélection a 4 enfants - deux pour les étiquettes d’option et deux autres pour le texte intérieur des étiquettes d’option. Enfin, le OuterHtml est comme ça:

<select id="foo_Bar" name="foo.Bar"><option selected="selected" value="1">One<option value="2">Two</select>

Donc, en gros, c'est moi qui décide de supprimer les balises de fermeture des options. Laissons de côté un instant s'il est approprié et souhaitable de le faire. J'utilise HtmlAgilityPack pour tester le code de génération HTML. Je ne souhaite donc pas que celui-ci prenne une décision à ma place ou donne des erreurs sauf si le code HTML est vraiment mal formé. Y a-t-il un moyen de le faire se comporter comme je le souhaite? J'ai essayé de définir certaines des options de HtmlDocument, notamment:

 doc.OptionAutoCloseOnEnd = false;
 doc.OptionCheckSyntax = false;
 doc.OptionFixNestedTags = false;

Ceci ne fonctionne pas. Si HtmlAgilityPack ne peut pas faire ce que je veux, pouvez-vous recommander quelque chose qui peut?

Réponse acceptée

La même erreur est signalée dans la discussion de la page d'accueil HAP, mais il semble qu'aucune correction significative n'ait été apportée au projet en quelques années. Pas encourageant.

Un rapide parcours de la source suggère que l'erreur peut être corrigée en commentant la ligne 92 de HtmlNode.cs:

// they sometimes contain, and sometimes they don 't...
ElementsFlags.Add("option", HtmlElementFlag.Empty);

(En fait non, ils contiennent toujours le texte de l'étiquette, bien qu'une chaîne vide soit également un texte valide. Un auteur négligent peut omettre la balise de fin, mais c'est également le cas pour n'importe quel élément.)

AJOUTER

Une solution équivalente appelle HtmlNode.ElementsFlags.Remove("option"); avant toute utilisation de liberary (sans qu'il soit nécessaire de modifier le code source de liberary)


Réponse populaire

Il semble qu'il y ait une raison de ne pas analyser la balise Option en tant que balise "générique", pour la conformité XHTML, mais cela peut être très pénible.

Ma suggestion est de faire une chaîne complète-remplacer et changer toutes les balises "option" pour les balises "my_option", de cette façon vous:

  1. Il n'est pas nécessaire de modifier le source de la bibliothèque (et peut le mettre à niveau ultérieurement).
  2. Peut analyser comme vous le feriez habituellement.

Le message d'origine sur le forum HtmlAgilityPack est disponible à l' adresse suivante : http://htmlagilitypack.codeplex.com/Thread/View.aspx?ThreadId=14982.



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