Htmlagilitypack gotas de opção tags finais
-
08-07-2019 - |
Pergunta
Estou usando htmlagilitypack. Eu crio um htmldocument e loadhtml com a seguinte sequência:
<select id="foo_Bar" name="foo.Bar"><option selected="selected" value="1">One</option><option value="2">Two</option></select>
Isso faz algumas coisas inesperadas. Primeiro, ele fornece dois erros de analisador, EndTagnotRequired. Segundo, o Node Select tem 4 filhos - dois para as tags de opção e mais duas para o texto interno das tags de opção. Por último, o OuterHtml é assim:
<select id="foo_Bar" name="foo.Bar"><option selected="selected" value="1">One<option value="2">Two</select>
Então, basicamente, está decidindo soltar as tags de fechamento nas opções. Vamos deixar de lado por um momento, seja adequado e desejável para fazer isso. Estou usando o HTMLAGILIDADEPACK para testar o código de geração HTML, por isso não quero que ele tome nenhuma decisão para mim ou faça erros, a menos que o HTML seja realmente malformado. Existe uma maneira de fazer isso se comportar como eu quero? Tentei definir algumas das opções para o HTMLDocument, especificamente:
doc.OptionAutoCloseOnEnd = false;
doc.OptionCheckSyntax = false;
doc.OptionFixNestedTags = false;
Isto não está a funcionar. Se o htmlagilitypack não pode fazer o que eu quero, você pode recomendar algo que possa?
Solução
O mesmo erro exatamente é relatado na discussão da página inicial do HAP, mas parece que nenhuma correção significativa foi feita no projeto em alguns anos. Não encorajador.
Uma navegação rápida da fonte sugere que o erro pode ser fixável comentando a linha 92 do htmlnode.cs:
// they sometimes contain, and sometimes they don 't...
ElementsFlags.Add("option", HtmlElementFlag.Empty);
(Na verdade, não, eles sempre contêm o texto da etiqueta, embora uma corda em branco também seja um texto válido. Um autor descuidado pode omitir a marca final, mas isso é verdade para qualquer elemento.)
ADICIONAR
Uma solução equivalente está ligando HtmlNode.ElementsFlags.Remove("option");
Antes de qualquer uso do Liberário (sem a necessidade de modificar o Código Fonte Liberário)
Outras dicas
Parece que há algum motivo para não analisar a tag de opção como uma tag "genérica", para a conformidade com XHTML, no entanto, isso pode ser uma dor real no pescoço.
Minha sugestão é fazer uma tags de barragem inteira e alterar as tags de "opção" para "my_option", assim você:
- Não precisa modificar a fonte da biblioteca (e pode atualizá -la mais tarde).
- Pode analisar como você costumava.
A postagem original no fórum htmlagilitypack pode ser encontrada em:http://htmlagilitypack.codeplex.com/thread/view.aspx?threadid=14982