2008-11-16 3 views
22

J'utilise HtmlAgilityPack. Je crée un HtmlDocument et loadHTML avec la chaîne suivante:HtmlAgilityPack Drops Option Fin Tags

<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. D'abord, il donne deux erreurs d'analyseur, EndTagNotRequired. Deuxièmement, le noeud select a 4 enfants - deux pour les tags d'option et deux autres pour le texte interne des tags d'option. Enfin, le outerHTML est comme ceci:

Donc, fondamentalement, il est de décider pour moi de laisser tomber les balises de fermeture des options. Laissons de côté pour un moment s'il est approprié et souhaitable de le faire. J'utilise HtmlAgilityPack pour tester le code de génération HTML, je ne veux donc pas prendre de décision pour moi ou donner des erreurs à moins que le HTML ne soit 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 pour HtmlDocument, en particulier:

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?

+0

pour toute personne confrontée à d'autre cette question, voir ma réponse sur http://stackoverflow.com/questions/759355/image-tag-not -closing-with-htmlagilitypack/12096383 # 12096383 pour une méthode de définition de la réponse de bobnce sans modifier la source HAP. – MaxPRafferty

Répondre

30

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

Une navigation rapide de la source suggère l'erreur pourrait être réparable 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 du texte d'étiquette, mais une chaîne vide serait également texte valide. Un auteur négligent peut omettre la balise de fin, mais qui est vrai de tout élément.)

AJOUTER

Une solution équivalente appelle HtmlNode.ElementsFlags.Remove("option"); avant toute utilisation de liberary (sans besoin de modifier le code source liberaire)

+0

Génial. Merci beaucoup. Fonctionne très bien! –

+2

J'ai rencontré ce problème en essayant d'obtenir la valeur InnerText de l'option. J'ai appliqué votre solution directement dans mon code en utilisant le HashTable statique exposé de HtmlNode: HtmlNode.ElementsFlags.Remove ("option"); –

+0

Salut Jason, comment as-tu résolu ce problème directement dans ton propre code? J'ai essayé HtmlNode.ElementsFlags.Supprimer ("option"); dans mon code, mais il n'a pas résolu le problème img tag non-fermeture? Pourriez-vous me donner des détails s'il vous plaît, je ne veux pas modifier et recompiler la source à moins que je doive le faire. Merci beaucoup! –

5

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 une réelle le cou.

Ma suggestion est de faire toute la chaîne-remplacer et changer tous les tags « option » à balises « my_option », de cette façon vous:

  1. Ne pas modifier la source de la bibliothèque (et peut le mettre à jour plus tard).
  2. Peut analyser comme vous le feriez habituellement.

Le message original sur le forum HtmlAgilityPack se trouve à l'adresse: http://htmlagilitypack.codeplex.com/Thread/View.aspx?ThreadId=14982