Pegar desde Word + Crear documento XML -> valor hexadecimal 0x0C, es un carácter no válido (.Net)
-
03-10-2019 - |
Pregunta
Tengo una página web que acepta HTML de entrada de los usuarios. La entrada se convierte en un documento XML usando el espacio de nombres System.Xml
, como este:
var doc = new XmlDocument();
doc.AppendChild(doc.CreateElement("root"));
doc.DocumentElement.SetAttribute("BodyHTML", theTextBox.Text);
Después una transformación XSL (System.Xml.Xsl.XslCompiledTransform
) se utiliza en los datos.
Los usuarios tienden a escribir texto en Microsoft Word, usando viñetas, citas, etc. Cuando se pega a mi página, el texto incluye caracteres no válidos como 0x0C, 0x03 y así sucesivamente. Cuando se utiliza la transformación XSL, este error se produce "valor hexadecimal 0x0C, es un carácter no válido."
Mi solución hasta el momento ha sido la eliminación de los personajes que he encontrado para ser ofensivo, utilizando bucles y String.Replace
:
Todos los caracteres de 0 a 31, con excepción de 9, 10 y 13 se sustituyen con String.Empty
.
Lo que estoy buscando es una mejor manera de hacer esto. Un método integrado .Net? O tal vez sólo una lista completa de caracteres Unicode ilegales.
Solución
Se han encontrado dos respuestas, que hacen lo mismo
- http: // seattlesoftware.wordpress.com/2008/09/11/hexadecimal-value-0-is-an-invalid-character/
- http://www.theplancollection.com /-artículos relacionados con la casa de planta / hexadecimal de valor no válido caracteres
Los primeros usos de un StringBuilder, recorre caracteres uno por uno y filtra los caracteres ilegales. Los segundo utiliza una expresión regular y .replace a lograr lo mismo. Ambos autores examinaron el estándar XML para saber qué caracteres son ilegales.
Hice algunos tiempos en una cadena larga (1.8 MB archivo de ejecución 1.000 veces) y una cadena corta ( "Hola mundo" ejecutar 10.000.000 veces). El método StringBuilder era ~ 3 veces más rápido que la expresión regular. La expresión regular fue compilado por supuesto, sólo una vez, a diferencia del código al cual he vinculado.
cadena larga:
CleanInvalidXmlChars time: 00:00:07.4356230
SanitizeXmlString time: 00:00:02.3703305
cadena corta:
CleanInvalidXmlChars time: 00:00:05.2805834
SanitizeXmlString time: 00:00:01.8319114