在HtmlAgilityPack loadhtml中丟失'小於'符號

c# html html-agility-pack

我最近開始嘗試使用HtmlAgilityPack。我不熟悉它的所有選項,我認為因為我做錯了。

我有一個包含以下內容的字符串:

string s = "<span style=\"color: #0000FF;\"><</span>";

你看,在我的範圍內,我有一個'不到'的標誌。我使用以下代碼處理此字符串:

HtmlDocument htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml(s);

但是當我在這樣的範圍內做一個快速而骯髒的外觀時:

htmlDocument.DocumentNode.ChildNodes[0].InnerHtml

我看到跨度是空的。

我需要設置什麼選項來保持“小於”符號。我已經嘗試過了:

htmlDocument.OptionAutoCloseOnEnd = false;
htmlDocument.OptionCheckSyntax = false;
htmlDocument.OptionFixNestedTags = false;

但沒有成功。

我知道它是無效的HTML。我使用它來修復無效的HTML並在'小於'符號上使用HTMLEncode

請指導我正確的方向。提前致謝

一般承認的答案

Html Agility Packs將此檢測為錯誤並為其創建HtmlParseError實例。您可以使用HtmlDocument類的ParseErrors讀取所有錯誤。所以,如果你運行這段代碼:

    string s = "<span style=\"color: #0000FF;\"><</span>";
    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(s);
    doc.Save(Console.Out);

    Console.WriteLine();
    Console.WriteLine();

    foreach (HtmlParseError err in doc.ParseErrors)
    {
        Console.WriteLine("Error");
        Console.WriteLine(" code=" + err.Code);
        Console.WriteLine(" reason=" + err.Reason);
        Console.WriteLine(" text=" + err.SourceText);
        Console.WriteLine(" line=" + err.Line);
        Console.WriteLine(" pos=" + err.StreamPosition);
        Console.WriteLine(" col=" + err.LinePosition);
    }

它將顯示此信息(首先是更正的文本,然後是錯誤的詳細信息):

<span style="color: #0000FF;"></span>

Error
 code=EndTagNotRequired
 reason=End tag </> is not required
 text=<
 line=1
 pos=30
 col=31

因此,您可以嘗試修復此錯誤,因為您擁有所有必需的信息(包括行,列和流位置),但HTML中修復(未檢測)錯誤的一般過程非常複雜。


熱門答案

正如另一個答案中所提到的,我發現的最佳解決方案是預先解析HTML以將孤立的<符號轉換為其HTML編碼值&lt;

return Regex.Replace(html, "<(?![^<]+>)", "&lt;");



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因