HtmlAgilityPack рассматривает все после <(меньше знака) как атрибуты

c# html-agility-pack

Вопрос

У меня есть некоторый ввод, который я получаю через текстовое поле, и я конвертирую этот ввод в html-документ, который позже разбирается в документе PDF.

Когда мои пользователи вводят меньше знака (<), все тормозит мой HtmlDocument. HtmlAgilityPack внезапно обрабатывает все после знака меньше, чем признак. См. Вывод:

Внутри этого блока данных символов я могу использовать двойные тире столько, сколько хочу (вместе с <, &, = "" ', = "" и = ""') = "" * и = "" * = ""% = "" myparamentity; = "" will = "" be = "" expand = "" to = "" the = "" text = "" 'has = "" was = "" расширенный ... однако, = "" i = "" not = "" use = "" the = "" cend = "" sequence (if = "" i = "" need = "" to = "" use = "" it = "" i = msgstr "" = "" = = "" = = "" = = "" = = "" = = ""

Это становится немного лучше, если я просто добавлю

htmlDocument.OptionOutputOptimizeAttributeValues = true;

который дает мне:

Внутри этого блока Character Data я могу использовать двойные тире столько, сколько хочу (вместе с <, &, = ', = и =') = * и = * =% = myparamentity; = will = be = extended = to = = text = 'has = was = extended' ... однако, = i = can not = use = the = cend = sequence (if = i = need = to = use = it = i = must = escape = one = of = the = brackets = or = the = больше, чем = знак). =>

Я пробовал все параметры на htmldocument, и ни один из них не позволяет мне указать, что парсер не должен быть строгим. С другой стороны, я мог бы жить с ним, убирая <, но добавление всех равных знаков на самом деле не работает для меня.

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

У кого-нибудь есть идея, как я могу решить эту проблему.

Самый близкий вопрос, который я могу найти, заключается в следующем: Потеря знака «меньше» в HtmlAgilityPack loadhtml

Там, где он действительно жалуется на <исчезновение, которое было бы хорошо для меня. Разумеется, исправление ошибки синтаксического анализа является лучшим решением.

EDIT: Я использую HtmlAgilityPack 1.4.9

Принятый ответ

Ваш контент не соответствует действительности. Речь идет не о «строгости», а о том, что вы притворяетесь, что часть текста действительна HTML. Фактически, результаты, которые вы получаете, являются именно тем, что парсер не является строгим.

Когда вам нужно вставить простой текст в HTML, вам необходимо сначала закодировать его, чтобы все различные управляющие символы HTML были правильно преобразованы в HTML - например, < должно быть изменено на &lt; и & к &amp; ,

Один из способов справиться с этим - использовать DOM - использовать InnerText в целевом div , вместо того, чтобы шлепать строки вместе и притворяться, что они HTML. Другим является использование некоторого явного метода кодирования - например, HttpUtility.HtmlEncode .


Популярные ответы

Вы можете использовать System.Net.WebUtility.HtmlEncode который работает даже без ссылки на System.Web.dll который также имеет 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());

Результат:

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

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow