2010-06-06 95 views
0

我需要能夠從包含已存儲在數據庫中的XHTML的字符串中刪除非XHTML標記。該字符串還包含XHTML中的控件(例如)的引用,但我需要乾淨的XHTML,並且所有標準標記內容都保持不變。如何從C#中的字符串中去除非XHTML標籤?

這些控件標籤是多種多樣的(它們可以是任何ASP.NET控件),所以有太多的東西去尋找每一個並將它們刪除。他們關閉的方式也各不相同,因此並非所有人都有結束標籤,有些則自動關閉。

我該如何去做這件事?我發現一些HTML清潔工在線上包含在我的項目中,但他們要麼刪除所有內容,要麼只是HTML編碼整個字符串。

此外,我正在處理部分XHTML文檔,而不是整個文檔 - 不知道這是否有所作爲。

任何幫助,將不勝感激。

一個例子(不是太棒了,但給你什麼,我有工作的想法):

<p><mycontrols:mycontrol myproperty="hello world" myproperty2="7"><SPAN><a href="#"><img title="an example image" height="68" width="180" alt="an example image" src="images/example1.gif"></a></span></mycontrols:mycontrol><a href="#"></a></p> 

需求,成爲:

<p><a href="#"></a></p> 
+0

正則表達式! http://stackoverflow.com/questions/1732348/#1732454 – 2010-06-06 14:05:52

+0

正則表達式可能是解決方案,但我不知道如何爲此寫入表達式。我不想刪除html,但我想刪除它們中的任何控件和html標籤(及其內容)。 – James 2010-06-07 09:17:49

回答

2

我不知道C#,但我確定它有一些寬鬆的HTML DOM解析器 - 寬鬆,因爲它可以正確處理自封閉或非封閉標籤。

我想除了用這樣一個庫來分支樹,拋出與valid XHTML tags list不匹配的任何節點,並且將它重新打包回字符串,沒有什麼別的事可做了。

0

對,這就是我已經做到的。使用HtmlAgilityPack。 (http://htmlagilitypack.codeplex.com/

這似乎有點太容易了,讓我覺得我已經忽略了可能存在的問題有,但這裏是代碼:

// Allowed Tags: http://www.w3schools.com/tags/default.asp 
string[] allowedTags = { "a", "abbr", "acronym", "address", "applet", "area", "b", "base", 
    "basefont", "bdo", "big", "blockquote", "body", "br", "button", 
    "caption", "center", "cite", "code", "col", "colgroup", "dd", 
    "del", "dfn", "dir", "div", "dl", "dt", "em", "fieldset", "font", 
    "form", "frame", "frameset", "h1", "h2", "h3", "h4", "h5", "h6", 
    "head", "hr", "html", "i", "iframe", "img", "input", "ins", "isindex", 
    "kbd", "label", "legend", "li", "link", "map", "menu", "meta", 
    "noframes", "noscript", "object", "ol", "optgroup", "option", "p", 
    "param ", "pre", "q", "s", "samp", "script", "select", "small", 
    "span", "strike", "strong", "style", "sub", "sup", "table", "tbody", 
    "td", "textarea", "tfoot", "th", "thead", "title", "tr", "tt", "u", 
    "ul", "var", "xmp" }; 


HtmlAgilityPack.HtmlDocument fullHtml = new HtmlAgilityPack.HtmlDocument(); 

fullHtml.LoadHtml(myStringOfHtml); 

HtmlAgilityPack.HtmlNodeCollection allNodes = fullHtml.DocumentNode.SelectNodes("//*"); 

if (allNodes != null) 
{ 
    foreach (var item in allNodes) 
    { 
     if (!allowedTags.Contains(item.Name)) 
      item.Remove(); 
    } 
} 

string output1 = fullHtml.DocumentNode.InnerHtml; 

讓我知道,如果你認爲有任何問題這個。我所處理的HTML總是具有結束標籤,並且(相對)結構良好,因爲它是在將其存儲在數據庫中之前通過另一家公司編寫的自定義HTML檢查器完成的。所以我不確定這是如何與格式錯誤的HTML一起工作的。

感謝Pekka建議採取'搜索和銷燬'方法。

相關問題