簡體   English   中英

使用 C# 從 html 中刪除自定義 xml 標簽

[英]Using C# to remove custom xml tags from html

我有一個帶有一些 html 代碼的字符串。 但是我需要將該 html 解析為XDocument

string input = String.Concat("<root>", htmlString, "</root>");
var doc = XDocument.Parse(input);

但有時在我的htmlString有像<o:p></o:p>這樣的標簽,例如,在XDocument.Parse()我得到了異常:

':' 字符,十六進制值 0x3A,不能包含在名稱中。 第 1 行,位置 650。

如何刪除該標簽或至少替換標簽名稱中的':'

在進行解析之前,我試圖刪除/替換':'但它不起作用:

try
{
    Regex regex = new Regex(@"<[:][^>]+>.+?</\[:]>");
    while (regex.IsMatch(htmlString))
    {
        htmlString= regex.Replace(htmlString, "");
    }
}
catch { }

HTML 示例

<p>Some text</p>

<p class="MsoNormal" style="TEXT-ALIGN: justify; MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%">
    <?xml:namespace prefix="o" ns="urn:schemas-microsoft-com:office:office"?>
    <o:p> </o:p>
</p>

<p>More text</p>

更新

我正在使用HtmlAgilityPack但它沒有刪除這個標簽。

我的代碼

ConfigureHtmlDocument();

var htmlDoc = new HtmlDocument();
htmlDoc.OptionFixNestedTags = true;
htmlDoc.LoadHtml(htmlString);

var htmlError = htmlDoc.ParseErrors.SafeAny();

if (!htmlError)
    htmlString= htmlDoc.DocumentNode.InnerHtml;

try
{
    Regex regex = new Regex(@"<[:][^>]+>.+?</\[:]>");
    while (regex.IsMatch(htmlString))
    {
        htmlString= regex.Replace(htmlString, "");
    }
}
catch { }

string input = String.Concat("<root>", htmlString, "</root>");
var doc = XDocument.Parse(input);

//more code

配置HtmlDocument()

    if (!HtmlNode.ElementsFlags.ContainsKey("p"))
        HtmlNode.ElementsFlags.Add("p", HtmlElementFlag.Closed);
    else
        HtmlNode.ElementsFlags["p"] = HtmlElementFlag.Closed;

    if (!HtmlNode.ElementsFlags.ContainsKey("ul"))
        HtmlNode.ElementsFlags.Add("ul", HtmlElementFlag.Closed);
    else
        HtmlNode.ElementsFlags["ul"] = HtmlElementFlag.Closed;

    if (!HtmlNode.ElementsFlags.ContainsKey("li"))
        HtmlNode.ElementsFlags.Add("li", HtmlElementFlag.Closed);
    else
        HtmlNode.ElementsFlags["li"] = HtmlElementFlag.Closed;

    if (!HtmlNode.ElementsFlags.ContainsKey("ol"))
        HtmlNode.ElementsFlags.Add("ol", HtmlElementFlag.Closed);
    else
        HtmlNode.ElementsFlags["ol"] = HtmlElementFlag.Closed;

    //more similar code

解決了! 正則表達式是錯誤的。 我用這個替換了表達式:

//for remove xml declarations
htmlString = Regex.Replace(texto, @"<\?xml.*\?>", "");

//for remove custom tags like <o:p> and </o:p>
htmlString = Regex.Replace(texto, @"<(?:[\S]\:[\S])[^>]*>", "");
htmlString = Regex.Replace(texto, @"</(?:[\S]\:[\S])[^>]*>", ""); 

現在它起作用了!

如果你事先知道命名空間,你可以做一些簡單的事情:

htmlString = htmlString.Replace("<o:", "<").Replace("</o:", "</");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM