HtmlAgilityPack tratta tutto dopo <(meno di segno) come attributi

c# html-agility-pack

Domanda

Ho qualche input che ottengo tramite una textarea e converto quell'input in un documento html, che viene poi analizzato in un documento PDF.

Quando i miei utenti inseriscono il segno minore (<) di tutto il freno nel mio HtmlDocument. HtmlAgilityPack gestisce improvvisamente tutto dopo il segno meno di un attributo. Vedi l'output:

All'interno di questo blocco di Dati Personali posso usare due trattini quanto voglio (insieme a <, &, = "" '= "" e = ""' = "" * e = "" * = ""% = "" myparamentity; = "" will = "" be = "" expanded = "" a = "" the = "" text = "" ha = "" been = "" expanded '... tuttavia, = "" i = "" can not = "" use = "" the = "" cend = "" sequenza (if = "" i = "" need = "" a = "" use = "" it = "" i = "" must = "" escape = "" one = "" of = "" the = "" parentets = "" or = "" the = "" greater-than = "" sign). = "">

Diventa un po 'meglio se aggiungo il

htmlDocument.OptionOutputOptimizeAttributeValues = true;

che mi dà:

All'interno di questo blocco di Dati Personali posso usare due trattini quanto voglio (insieme a <, &, = ', = e =') = * e = * =% = myparamentity; = will = be = expanded = to = the = text = 'has = been = expanded' ... tuttavia, = i = can not = use = the = cend = sequenza (if = i = need = to = use = it = i = must = escape = one = di = il = parentesi = o = il = maggiore-di = segno). =>

Ho provato tutte le opzioni su htmldocument e nessuna di esse mi consente di specificare che il parser non dovrebbe essere severo. D'altra parte potrei riuscire a conviverci spogliando il <, ma aggiungere tutti i segni di uguale non funziona davvero per me.

void Main()
{
    var input = @"Within this Character Data block I can use double dashes as much as I want (along with <, &, ', and ') *and * % MyParamEntity; will be expanded to the text 'Has been expanded'...however, I can't use the CEND sequence(if I need to use it I must escape one of the brackets or the greater-than sign).";

    var htmlDoc = WrapContentInHtml(input);

    htmlDoc.DocumentNode.OuterHtml.ToString().Dump();
}

private HtmlDocument WrapContentInHtml(string content)
{
    var htmlBuilder = new StringBuilder();
    htmlBuilder.AppendLine("<!DOCTYPE html>");
    htmlBuilder.AppendLine("<html>");
    htmlBuilder.AppendLine("<head>");
    htmlBuilder.AppendLine("<title></title>");
    htmlBuilder.AppendLine("</head>");
    htmlBuilder.AppendLine("<body><div id='sagsfremstillingContainer'>");
    htmlBuilder.AppendLine(content); 
    htmlBuilder.AppendLine("</div></body></html>");

    var htmlDocument = new HtmlDocument();
    htmlDocument.OptionOutputOptimizeAttributeValues = true;
    var htmlDoc = htmlBuilder.ToString();

    htmlDocument.LoadHtml(htmlDoc);

    return htmlDocument;
}

Qualcuno ha un'idea su come posso risolvere questo problema.

La domanda più vicina che riesco a trovare è questa: perdere il segno "minore di" in HtmlAgilityPack loadhtml

Dove si lamenta in realtà del <sparire che andrebbe bene per me. Certo che correggere l'errore di analisi è la soluzione migliore.

EDIT: sto usando HtmlAgilityPack 1.4.9

Risposta accettata

Il tuo contenuto è palesemente sbagliato. Non si tratta di "rigore", ma del fatto che fingi che una parte di testo sia HTML valido. In effetti, i risultati che ottieni sono esattamente perché il parser non è severo.

Quando devi inserire testo semplice in HTML, devi prima codificarlo, in modo che tutti i vari caratteri di controllo HTML vengano convertiti correttamente in HTML, ad esempio, < deve essere cambiato in &lt; e & a &amp; .

Un modo per gestire questo è usare il DOM - usa InnerText sul div destinazione, invece di slappare le stringhe insieme e fingere di essere HTML. Un altro è utilizzare un metodo di codifica esplicita, ad esempio HttpUtility.HtmlEncode .


Risposta popolare

È possibile utilizzare System.Net.WebUtility.HtmlEncode che funziona anche senza riferimento a System.Web.dll che ha anche HttpServerUtility.HtmlEncode

var input = @"Within this Character Data block I can use double dashes as much as I want (along with <, &, ', and ') *and * % MyParamEntity; will be expanded to the text 'Has been expanded'...however, I can't use the CEND sequence(if I need to use it I must escape one of the brackets or the greater-than sign).";
var htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml(System.Net.WebUtility.HtmlEncode(input));
Debug.Assert(!htmlDocument.ParseErrors.Any());

Risultato:

Within this Character Data block I can use double dashes as much as I want (along with &lt;, &amp;, &#39;, and &#39;) *and * % MyParamEntity; will be expanded to the text &#39;Has been expanded&#39;...however, I can&#39;t use the CEND sequence(if I need to use it I must escape one of the brackets or the greater-than sign).


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é