2010-06-06 62 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建议采取'搜索和销毁'方法。

相关问题