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 alcune cose inaspettate. Innanzitutto, fornisce due errori del parser, EndTagNotRequired. In secondo luogo, il nodo select ha 4 figli: due per i tag delle opzioni e altri due per il testo interno dei tag delle opzioni. Infine, OuterHtml è così:

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

Quindi, in pratica, sto decidendo di lasciare cadere i tag di chiusura sulle opzioni. Lasciamo da parte per un momento se è giusto e desiderabile farlo. Sto usando HtmlAgilityPack per testare il codice di generazione HTML, quindi non voglio che prenda alcuna decisione per me o dia qualche errore a meno che l'HTML non sia realmente malformato. C'è un modo per farlo comportare 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 consigliarmi qualcosa che può?

È stato utile?

Soluzione

Lo stesso errore esatto è riportato nella discussione sulla 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 risolto 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 il testo dell'etichetta, anche se una stringa vuota sarebbe anche un testo valido. Un autore distratto potrebbe omettere il tag di fine, ma è vero per qualsiasi elemento.)

Aggiungi

Una soluzione equivalente sta chiamando HtmlNode.ElementsFlags.Remove (" option "); prima di qualsiasi uso di liberary (senza la necessità di modificare il codice sorgente liberary)

Altri suggerimenti

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

Il mio suggerimento è di sostituire un'intera stringa e cambiare tutte le opzioni " " tag a " my_option " tag, in questo modo:

  1. Non è necessario modificare l'origine della libreria (e può aggiornarla in un secondo momento).
  2. Può analizzare come faresti normalmente.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top