HtmlAgilityPack은 <(부호보다 작음) 이후의 모든 것을 속성으로 처리합니다.

c# html-agility-pack

문제

나는 텍스트 영역을 통해 얻은 몇 가지 입력을 가지고 있으며, 그 입력을 HTML 문서로 변환한다.이 문서는 나중에 PDF 문서로 파싱된다.

내 사용자가 기호 (<)보다 작은 문자를 입력하면 HtmlDocument에 모든 것이 손상됩니다. HtmlAgilityPack은 덜 서명 이후의 모든 것을 갑자기 속성으로 처리합니다. 출력을보십시오 :

이 문자 데이터 블록 내에서 원하는만큼 이중 대시를 사용할 수 있습니다 (<, &, = "", = ""및 = "" ') = ""* 및 = ""* = ""% = "=" "=" "=" "=" "=" "=" "=" "=" "=" "= == "cend =" "순서 (if =" "i =" "필요 =" "=="사용 = ""== "i = "대괄호 =" "또는 =" "=" "보다 큼 =" "기호). =" ">"= ""이스케이프 =

방금 추가하면 조금 좋아집니다.

htmlDocument.OptionOutputOptimizeAttributeValues = true;

나에게주는 :

이 문자 데이터 블록 내에서 원하는만큼 이중 대시를 사용할 수 있습니다 (<, &, =, = 및 = ') = * 및 = * = % = myparamentity; = will = be = expanded = to = = text = 'has = been = expanded'... 그러나 if = use = the = cend = sequence (if = i = 필요 = 사용 = it = i = must = escape = one = of = the = 대괄호 = 또는 = the = greater-than = 부호) =>

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의 'less than'기호가 손실됩니다.

그는 실제로 나를 위해 좋을 <사라지는 것에 대해 불평하는 곳. 물론 구문 분석 오류를 수정하는 것이 가장 좋은 방법입니다.

편집 : HtmlAgilityPack 1.4.9 사용하고 있습니다.

수락 된 답변

귀하의 콘텐츠는 노골적으로 잘못되었습니다. 이것은 "엄격함"에 관한 것이 아니라, 실제로 텍스트가 유효한 HTML임을 가장하는 것이 사실입니다. 파서가 엄격 하지 않기 때문에 실제로 얻는 결과는 정확하게 나타납니다.

HTML에 일반 텍스트를 삽입해야하는 경우 먼저 다양한 HTML 컨트롤 문자가 HTML로 제대로 변환되도록 인코딩해야합니다. 예를 들어 << &lt; &&amp; .

이 문제를 처리하는 한 가지 방법은 DOM을 사용하는 것입니다. 문자열을 묶고 HTML 인 척하는 대신 대상 div 에서 InnerText 를 사용하십시오. 다른 하나는 명시 적 인코딩 방법을 사용하는 것입니다 (예 : HttpUtility.HtmlEncode .


인기 답변

HttpServerUtility.HtmlEncode 가있는 System.Web.dll 대한 참조 없이도 작동하는 System.Net.WebUtility.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).


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.