Вставить из Word + Создать документ XML -> шестнадцатеричное значение 0x0C, является недопустимым символом (.Net) - PullRequest
3 голосов
/ 20 мая 2010

У меня есть веб-страница, которая принимает 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? Или, возможно, просто полный список недопустимых символов Юникода.

1 Ответ

9 голосов
/ 20 мая 2010

Найдены два ответа, которые делают одно и то же

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

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

Я сделал несколько таймингов для длинной строки (файл размером 1,8 МБ, запущенный 1000 раз) и короткой строки ("Hello world", запущенный 10 000 000 раз),Метод StringBuilder был ~ в 3 раза быстрее, чем регулярное выражение.Конечно, регулярное выражение было скомпилировано только один раз, в отличие от кода, на который я ссылался.

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

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

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

CleanInvalidXmlChars time: 00:00:05.2805834
SanitizeXmlString    time: 00:00:01.8319114
...