HTMl敏捷包錯誤解析並返回XElement

.net-3.5 c# html-agility-pack html-parsing

我可以解析文檔並生成輸出,但由於ap標記,輸出無法解析為XElement,字符串中的所有其他內容都被正確解析。

我的意見:

var input = "<p> Not sure why is is null for some wierd reason!<br><br>I have implemented the auto save feature, but does it really work after 100s?<br></p> <p> <i>Autosave?? </i> </p> <p>we are talking...</p><p></p><hr><p><br class=\"GENTICS_ephemera\"></p>";

我的代碼:

var input = "<p> Not sure why is is null for some wierd reason!<br><br>I have implemented the auto save feature, but does it really work after 100s?<br></p> <p> <i>Autosave?? </i> </p> <p>we are talking...</p><p></p><hr><p><br class=\"GENTICS_ephemera\"></p>";

我的輸出:

var input = "<p> Not sure why is is null for some wierd reason!<br><br>I have implemented the auto save feature, but does it really work after 100s?<br></p> <p> <i>Autosave?? </i> </p> <p>we are talking...</p><p></p><hr><p><br class=\"GENTICS_ephemera\"></p>";

粗體p標籤是沒有正確輸出的標籤......有沒有辦法解決這個問題?我做錯了代碼嗎?

一般承認的答案

你要做的是基本上將Html輸入轉換為Xml輸出。

當您使用OptionOutputAsXml選項時,Html Agility Pack可以做到這OptionOutputAsXml ,但在這種情況下,您不應該使用InnerHtml屬性,而是讓Html Agility Pack為您做好基礎工作,使用HtmlDocument的Save方法之一。

這是一個將Html文本轉換為XElement實例的通用函數:

public static XElement HtmlToXElement(string html)
{
    if (html == null)
        throw new ArgumentNullException("html");

    HtmlDocument doc = new HtmlDocument();
    doc.OptionOutputAsXml = true;
    doc.LoadHtml(html);
    using (StringWriter writer = new StringWriter())
    {
        doc.Save(writer);
        using (StringReader reader = new StringReader(writer.ToString()))
        {
            return XElement.Load(reader);
        }
    }
}

如您所見,您不必自己做太多工作!請注意,由於您的原始輸入文本沒有根元素,Html Agility Pack將自動添加一個封閉的SPAN以確保輸出有效Xml。

在你的情況下,你想要另外處理一些標籤,所以,這裡是如何處理你的例子:

public static XElement HtmlToXElement(string html)
{
    if (html == null)
        throw new ArgumentNullException("html");

    HtmlDocument doc = new HtmlDocument();
    doc.OptionOutputAsXml = true;
    doc.LoadHtml(html);
    using (StringWriter writer = new StringWriter())
    {
        doc.Save(writer);
        using (StringReader reader = new StringReader(writer.ToString()))
        {
            return XElement.Load(reader);
        }
    }
}

如您所見,您不應該使用原始字符串函數,而是使用Html Agility Pack DOM函數(SelectNodes,Add,Remove等等)。


熱門答案

如果您查看OptionFixNestedTags的文檔註釋,您將看到以下內容:

//     Defines if LI, TR, TH, TD tags must be partially fixed when nesting errors
//     are detected. Default is false.

因此,我認為這不會幫助您使用未關閉的HTML p標記。根據舊的SO問題C#庫來清理HTML,雖然HTML Tidy可能會用於此目的。




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