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 balises d’option et deux autres pour le texte intérieur des balises 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 at-il un moyen de le faire se comporter comme je le veux? J'ai essayé de définir certaines des options de HtmlDocument, notamment:

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

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

Était-ce utile?

La solution

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.

Une recherche rapide dans 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 de tous les éléments.)

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 ce dernier)

Autres conseils

Il semble y avoir une raison de ne pas analyser la balise Option en tant que "générique". tag, pour la conformité XHTML, cependant cela peut être une vraie douleur au cou.

Je vous suggère de remplacer la totalité de la chaîne et de modifier toutes les "options". balises vers " mon_option " tags, de cette façon vous:

  1. Il n'est pas nécessaire de modifier le source de la bibliothèque (et peut la 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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top