代码之家  ›  专栏  ›  技术社区  ›  James

如何从C_中的字符串中去掉非XHTML标记?

  •  0
  • James  · 技术社区  · 16 年前

    我需要能够从包含存储在数据库中的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>
    
    2 回复  |  直到 16 年前
        1
  •  2
  •   Pekka    16 年前

    我不知道C,但我确信它有一些宽泛的HTML DOM解析器-宽泛的,因为它可以在一半的时候正确地处理自结束或非结束标记。

    我想除了把树和这样一个库放在一起,扔掉任何不符合 valid XHTML tags list 把它重新包装成一根绳子。

        2
  •  0
  •   James    16 年前

    是的,我就是这么做的。使用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建议采用“搜索和销毁”方法。

    推荐文章