我需要能够从包含存储在数据库中的XHTML的字符串中删除非XHTML标记。该字符串还包含XHTML内部控件(例如)的引用,但我需要干净的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 :(得分:2)
我不知道C#,但我确信它有一些宽松的HTML DOM解析器 - 宽松,因为它可以正常处理自我或非关闭标签。
我想除了将树与这样的库混淆之外没有其他事可做,抛弃任何与valid XHTML tags list不匹配的节点,并将其重新包装回字符串中。
答案 1 :(得分: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建议采取'搜索和破坏'方法。