Как я могу удалить теги не XHTML из строки в C #? - PullRequest
0 голосов
/ 06 июня 2010

Мне нужно иметь возможность удалять не 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 ]

2 голосов
/ 06 июня 2010

Я не знаю C #, но я уверен, что в нем есть несколько снисходительных HTML-анализаторов DOM - так как он может на полпути правильно работать с самозакрывающимися или незамкнутыми тегами.

Полагаю, нет ничего другого, кроме как обработать дерево с такой библиотекой, выбросить любой узел, который не соответствует списку допустимых тегов XHTML , и снова упаковать его обратно в строку.

0 голосов
/ 07 июня 2010

Правильно, вот как я это сделал. Использование 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.

Спасибо Пекке за предложение использовать метод поиска и уничтожения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...