HtmlAgilityPack traite tout ce qui se trouve après <(moins que le signe) en tant qu'attribut

c# html-agility-pack

Question

J'ai quelques entrées que je reçois via un textarea et je convertis ces entrées en un document html, qui est ensuite analysé en un document PDF.

Lorsque mes utilisateurs entrent le signe inférieur à (<), tout freine dans mon document HTML. HtmlAgilityPack gère soudainement tout ce qui suit le signe moins que comme un attribut. Voir la sortie:

Dans ce bloc de données de caractère, je peux utiliser autant de tirets que je le souhaite (avec <, &, = "", = "" et = "" ') = "" et * "* =" "% = "" myparamentity; = "" will = "" be = "" expand = "" to = "" the = "" text = "" 'a = "" été = "" expand "... cependant, =" " i = "" ne peut pas = "" utiliser = "" le = "" cend = "" séquence (si = "" i = "" besoin = "" à = "" utiliser = "" il = "" i = "" doit = ​​"" escape = "" one = "" of = "" the = "" brackets = "" ou = "" le = "" plus grand que = "" signe). = "">

C’est un peu mieux si j’ajoute simplement le

htmlDocument.OptionOutputOptimizeAttributeValues = true;

ce qui me donne:

Dans ce bloc de données de caractère, je peux utiliser autant de tirets doubles que je le souhaite (avec <, &, = ', = et =') = * et = * =% = myparamentity; = sera = sera = développé = à = le = text = 'a = été = développé' ... cependant, = i = ne peut pas = utiliser = le = cend = séquence (si = i = besoin = à = utiliser = il = i = doit = ​​échapper = un = de = les = parenthèses = ou = le = plus grand que = signe). =>

J'ai essayé toutes les options du document htmldocument et aucune d'elles ne me permet de préciser que l'analyseur ne doit pas être strict. D’autre part, je pourrais peut-être survivre en supprimant le <, mais l’ajout de tous les signes égaux ne me convient pas vraiment.

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

Quelqu'un a-t-il une idée de la façon dont je peux résoudre ce problème?

La question la plus proche que je puisse trouver est la suivante: Perdre le signe "inférieur à" HtmlAgilityPack loadhtml

Où il se plaint réellement de la disparition, ce qui me conviendrait mieux. Bien sûr, la résolution de l'erreur d'analyse est la meilleure solution.

EDIT: J'utilise HtmlAgilityPack 1.4.9

Réponse acceptée

Votre contenu est manifestement faux. Il ne s'agit pas de "rigueur", mais du fait que vous prétendez qu'un morceau de texte est un code HTML valide. En fait, les résultats que vous obtenez sont exactement dus au fait que l'analyseur n'est pas strict.

Lorsque vous devez insérer du texte brut dans HTML, vous devez d'abord l'encoder pour que tous les caractères de contrôle HTML soient convertis correctement en HTML. Par exemple, < doit être remplacé par &lt; et & to &amp; .

Une façon de gérer cela consiste à utiliser le DOM - utilisez InnerText sur la div cible, au lieu de lier des chaînes et de prétendre qu'elles sont HTML. Une autre consiste à utiliser une méthode de codage explicite, par exemple HttpUtility.HtmlEncode .


Réponse populaire

Vous pouvez utiliser System.Net.WebUtility.HtmlEncode qui fonctionne même sans référence à System.Web.dll qui contient également 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());

Résultat:

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



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi