Pegar desde Word + Crear documento XML -> valor hexadecimal 0x0C, es un carácter no válido (.Net)

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

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.

¿Fue útil?

Solución

Se han encontrado dos respuestas, que hacen lo mismo

  1. http: // seattlesoftware.wordpress.com/2008/09/11/hexadecimal-value-0-is-an-invalid-character/
  2. 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top