HtmlAgilityPack: Qualcuno potrebbe spiegare esattamente qual è l'effetto dell'impostazione dell'HtmlDocument OptionAutoCloseOnEnd su true?

c# html-agility-pack

Domanda

La documentazione attuale dice:

Definisce se la chiusura per nodi non chiusi deve essere effettuata alla fine o direttamente nel documento. L'impostazione su true può effettivamente cambiare il modo in cui i browser eseguono il rendering della pagina. Il valore predefinito è falso.

Mi dispiace, devo ammettere che non capisco questo paragrafo. Specificamente "alla fine" di cosa? E cosa significa "nel documento" significa esattamente? La frase che precede l'ultima sembra minacciosa. Se l'opzione è impostata su true e se l'html è formattato correttamente, ciò influenzerà ancora il documento?

Ho cercato nel codice sorgente ma non ho capito cosa sta succedendo - il codice reagisce alla proprietà non impostata su true. Vedere HtmlNode.cs e cercare OptionAutoCloseOnEnd - line 1707. Ho anche trovato un codice funky in HtmlWeb.cs alle righe 1113 e 1154. Peccato che il browser del codice sorgente non mostri i numeri di riga ma cerchi OptionAutoCloseOnEnd nella pagina.

Potresti per favore illustrare con un esempio cosa fa questa opzione?

Sto utilizzando HtmlAgilityPack per correggere alcuni html non validi e per esportare il contenuto della pagina in xml.

Mi sono imbattuto in alcuni tag html formattati in modo non corretto. Ecco il frammento:

<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>

Si noti che il primo tag p non è chiuso e si noti il ​​tag STRONG sovrapposto.

Se imposto OptionAutoCloseOnEnd, questo viene risolto in qualche modo. Sto cercando di capire quale sia esattamente l'effetto di impostare questa proprietà su true in generale nella struttura del documento.

Ecco il codice C # che sto usando:

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

Grazie!

Risposta accettata

Il codice corrente chiude sempre i nodi non chiusi appena prima che il nodo genitore venga chiuso. Quindi il seguente codice

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

emetterà questo (il non chiuso <y> è chiuso prima che il genitore <x> sia chiuso)

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

Originariamente, l'opzione, se impostata, doveva essere in grado di produrre questo invece (non per i tipi di output XML):

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

con la chiusura <y> impostata alla fine del documento (questo è ciò che significa "fine"). Nota in questo caso, puoi ancora ottenere elementi sovrapposti.

Questa caratteristica (forse inutile che posso ammetterlo) è stata interrotta da qualche parte nel passato, non so perché.

Nota La casella di testo <p> è speciale in quanto, per impostazione predefinita, è gestita da HtmlElementFlag personalizzato. Questo è il modo in cui è dichiarato in HtmlNode.cs:

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

Risposta popolare

Il modo migliore per utilizzare HtmlAgilityPack sarebbe aprire e chiudere i tag a livello di codice ovunque richiesto e impostare:

 doc.OptionAutoCloseOnEnd = false;

Quale ti darà la formattazione prevista.

In caso contrario, la libreria controllerà eventuali tag che non sono chiusi e li chiuderà ovunque si ritenga opportuno, secondo il flusso di esecuzione del codice.



Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché