Вставить из Word + Create XML-документ -> шестнадцатеричное значение 0x0c, является неверным символом (.NET)
-
03-10-2019 - |
Вопрос
У меня есть веб-страница, которая принимает 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.
Решение
Нашел два ответа, которые делают то же самое
- http://seatttletsoftware.wordpress.com/2008/09/11/hexadecimal-value-0-is-an-invalid-character/
- 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