HtmlAgilityPack: Quelqu'un pourrait-il expliquer s'il vous plaît exactement quel est l'effet de la définition de HtmlDocument OptionAutoCloseOnEnd sur true?

c# html-agility-pack

Question

La documentation actuelle dit:

Définit si la fermeture des nœuds non fermés doit être effectuée à la fin ou directement dans le document. Définir ceci sur true peut réellement changer la façon dont les navigateurs rendent la page. La valeur par défaut est false.

Désolé, je dois admettre que je ne comprends pas ce paragraphe. Spécifiquement "à la fin" de quoi? Et que signifie exactement "dans le document"? La phrase avant la dernière semble inquiétante. Si l'option est définie sur true et que le code HTML est correctement formaté, cela affectera-t-il toujours le document?

J'ai regardé dans le code source mais je ne comprenais pas ce qui se passait - le code réagissait lorsque la propriété n'était pas définie sur true. Voir HtmlNode.cs , et recherchez OptionAutoCloseOnEnd - ligne 1707. J'ai également trouvé du code génial dans HtmlWeb.cs aux lignes 1113 et 1154. Dommage que le navigateur de code source n'affiche pas les numéros de lignes, mais recherche OptionAutoCloseOnEnd dans la page.

Pourriez-vous s'il vous plaît illustrer par un exemple le rôle de cette option?

J'utilise HtmlAgilityPack pour corriger certains codes html et exporter le contenu de la page au format xml.

Je suis tombé sur des balises HTML superposées et mal formatées. Voici l'extrait de code:

<p>Blah bah
<P><STRONG>Some Text</STRONG><STRONG></p>
<UL>
<LI></STRONG>Item 1.</LI>
<LI>Item 2</LI>
<LI>Item 3</LI></UL>

Notez que la première balise p n'est pas fermée et notez la balise STRONG superposée.

Si je mets OptionAutoCloseOnEnd, cela sera en quelque sorte corrigé. J'essaie de comprendre quel est exactement l'effet de la définition de cette propriété sur true en général dans la structure du document.

Voici le code C # que j'utilise:

HtmlDocument doc = new HtmlDocument();
doc.OptionOutputAsXml = true;
doc.OptionFixNestedTags = true;      
//  doc.OptionAutoCloseOnEnd = true;    
doc.LoadHtml(htmlText);

Je vous remercie!

Réponse acceptée

Le code actuel ferme toujours les nœuds non fermés juste avant la fermeture du nœud parent. Donc le code suivant

var doc = new HtmlDocument();
doc.LoadHtml("<x>hello<y>world</x>");
doc.Save(Console.Out);

affichera ceci (le <y> non fermé est fermé avant que le parent <x> soit fermé)

<x>hello<y>world</y></x>

À l'origine, l'option, lorsqu'elle était définie, devait permettre de produire ceci à la place (pas pour les types de sortie XML):

<x>hello<y>world</x></y>

avec la fermeture <y> définie à la fin du document (c’est ce que signifie "fin"). Notez que dans ce cas, vous pouvez toujours obtenir des éléments qui se chevauchent.

Cette fonctionnalité (peut-être inutile je peux l'avouer) a été brisée quelque part dans le passé, je ne sais pas pourquoi.

Remarque La casse de la balise <p> est spéciale car elle est régie par défaut par HtmlElementFlag personnalisé. Voici comment cela est déclaré dans HtmlNode.cs:

ElementsFlags.Add("p", HtmlElementFlag.Empty | HtmlElementFlag.Closed);

Réponse populaire

La meilleure façon d'utiliser HtmlAgilityPack serait d'ouvrir et de fermer les balises par programmation, si nécessaire, et de définir:

 doc.OptionAutoCloseOnEnd = false;

Ce qui vous donnera le formatage attendu.

Sinon, la bibliothèque recherchera toutes les balises qui ne sont pas fermées et les fermera chaque fois que cela semblera approprié selon votre flux d'exécution de code.




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