Я только что попробовал свое решение XElement.Parse. Я создал метод расширения для строкового класса, чтобы можно было легко повторно использовать код:
public static bool ContainsXHTML(this string input)
{
try
{
XElement x = XElement.Parse("<wrapper>" + input + "</wrapper>");
return !(x.DescendantNodes().Count() == 1 && x.DescendantNodes().First().NodeType == XmlNodeType.Text);
}
catch (XmlException ex)
{
return true;
}
}
Одна проблема, которую я обнаружил, заключалась в том, что обычный текст с амперсандом и символами, меньшими, чем символы, вызывают исключение XmlException и указывают, что поле содержит HTML (что неверно). Чтобы это исправить, входная строка, переданная в первую очередь, должна иметь амперсанды и меньше символов, преобразованных в их эквивалентные сущности XHTML. Я написал другой метод расширения, чтобы сделать это:
public static string ConvertXHTMLEntities(this string input)
{
// Convert all ampersands to the ampersand entity.
string output = input;
output = output.Replace("&", "amp_token");
output = output.Replace("&", "&");
output = output.Replace("amp_token", "&");
// Convert less than to the less than entity (without messing up tags).
output = output.Replace("< ", "< ");
return output;
}
Теперь я могу взять отправленную пользователем строку и проверить, что она не содержит HTML, используя следующий код:
bool ContainsHTML = UserEnteredString.ConvertXHTMLEntities().ContainsXHTML();
Я не уверен, является ли это пуленепробиваемым, но я думаю, что этого достаточно для моей ситуации.