Вставить из Word + Create XML-документ -> шестнадцатеричное значение 0x0c, является неверным символом (.NET)

StackOverflow https://stackoverflow.com/questions/2874330

Вопрос

У меня есть веб-страница, которая принимает HTML-вход от пользователей. Вход преобразуется в документ XML с помощью System.Xml пространство имен, как это:

var doc = new XmlDocument();
doc.AppendChild(doc.CreateElement("root"));
doc.DocumentElement.SetAttribute("BodyHTML", theTextBox.Text);

После последующей преобразования XSL (System.Xml.Xsl.XslCompiledTransform) используется на данных.

Пользователи, как правило, пишет текст в Microsoft Word, используя пули, цитаты и т. Д. При вставки на мою страницу их текст включает в себя недопустимые символы, такие как 0x0c, 0x03 и так далее. При использовании преобразования XSL эта ошибка возникает «шестнадцатеричное значение 0x0c, является неверным символом».

Мое исправление до сих пор было устранить персонажей, которые я нашел оскорбительным, используя петли и String.Replace: Все символы от 0 до 31, кроме 9, 10 и 13 заменены на String.Empty.

Что я ищу, это лучший способ сделать это. Встроенный метод .NET? Или, возможно, просто полный список нелегальных символов Unicode.

Это было полезно?

Решение

Нашел два ответа, которые делают то же самое

  1. http://seatttletsoftware.wordpress.com/2008/09/11/hexadecimal-value-0-is-an-invalid-character/
  2. http://www.theplancollection.com/house-plan-related-value/hexadecimal-value-invalid-haracter.

Первый использует StringBuilder, петли через символы один за другим и фильтрует нелегальные символы. Второй использует Regex и .replace для достижения того же. Оба автора смотрели на стандарт XML, чтобы узнать, какие символы являются незаконными.

Я сделал несколько времен на длинной строке (1,8 МБ файл бежит в 1000 раз) и короткая строка («Hello World» Run 10 000 000 раз). Метод StringBuilder был в 3 раза быстрее, чем Regex. Regex, конечно, был только скомпилирован только один раз, в отличие от кода, к которому я связал.

Длинная строка:

CleanInvalidXmlChars time: 00:00:07.4356230
SanitizeXmlString    time: 00:00:02.3703305

Короткая строка:

CleanInvalidXmlChars time: 00:00:05.2805834
SanitizeXmlString    time: 00:00:01.8319114
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top