Tag di chiusura dell'opzione HtmlAgilityPack Drops

html html-agility-pack parsing

Domanda

Sto usando HtmlAgilityPack. Creo un HtmlDocument e LoadHtml con la seguente stringa:

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

Questo fa cose inaspettate. Innanzitutto, fornisce due errori del parser, EndTagNotRequired. In secondo luogo, il nodo di selezione ha 4 figli: due per i tag di opzione e altri due per il testo interno dei tag di opzione. Infine, l'OuterHtml è così:

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

Quindi, in sostanza, è decidere per me di lasciare i tag di chiusura sulle opzioni. Lasciamo da parte per un momento se è opportuno e desiderabile farlo. Sto usando HtmlAgilityPack per testare il codice di generazione HTML, quindi non voglio che prenda alcuna decisione per me o dia errori se l'HTML non è veramente malformato. C'è un modo per farlo comportarsi come voglio? Ho provato a impostare alcune delle opzioni per HtmlDocument, in particolare:

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

Questo non funziona. Se HtmlAgilityPack non può fare ciò che voglio, puoi consigliare qualcosa che può?

Risposta accettata

Lo stesso identico errore è riportato nella discussione della home page di HAP, ma sembra che non siano state apportate correzioni significative al progetto in pochi anni. Non incoraggiante.

Una rapida ricerca della fonte suggerisce che l'errore potrebbe essere risolvibile commentando la riga 92 di HtmlNode.cs:

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

(In realtà no, contengono sempre testo dell'etichetta, anche se una stringa vuota sarebbe anche un testo valido. Un autore disattento potrebbe omettere il tag di fine, ma questo è vero per qualsiasi elemento.)

INSERISCI

Una soluzione equivalente sta chiamando HtmlNode.ElementsFlags.Remove("option"); prima di ogni uso del liberale (senza bisogno di modificare il codice sorgente liberatorio)


Risposta popolare

Sembra che ci sia qualche motivo per non analizzare il tag Option come un tag "generico", per la conformità XHTML, tuttavia questo può essere un vero dolore al collo.

Il mio suggerimento è di fare una sostituzione stringa intera e modificare tutti i tag "opzione" sui tag "my_option", in questo modo:

  1. Non è necessario modificare la sorgente della libreria (e aggiornarla in seguito).
  2. Può analizzare come faresti normalmente.

Il post originale sul forum HtmlAgilityPack è disponibile all'indirizzo: http://htmlagilitypack.codeplex.com/Thread/View.aspx?ThreadId=14982



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é