2009-10-29 36 views
6

Tengo un objeto que estoy serializando en xml. Parece que un valor en una de las propiedades contiene el carácter hexadecimal 0x1E. Intenté establecer la propiedad Codificación de XmlWriterSettings en "utf-16" y "Unicode", pero todavía aparece una excepción:Tratar con caracteres prohibidos en XML usando C# .NET

aquí había un error al generar el documento XML. ---> System.InvalidOperationException: Hubo un error al generar el documento XML. ---> System.ArgumentException: '', valor hexadecimal 0x1E, es un caracter no válido.

¿Hay alguna forma de insertar estos caracteres en el xml? Si no, ¿hay otros personajes que causarán problemas?

+0

Por favor, muestre algún código que reproduzca el problema. ¿Cómo podemos ayudarlo cuando no sabemos lo que está haciendo para causar el problema? –

Respuesta

2

Puede escapar entonces como lo haría para HTML. 0x1E es igual que el decimal 30 así que simplemente reemplace su carácter separador de registro con la cadena, "& 30;" y debería estar bien.

+0

Oye ... Intenté usarlo, pero los navegadores y los lectores de XML aún lo vuelven a publicar como un carácter no válido. Por ejemplo, este XML no es válido: ' bbb  ccc' –

7

La Recomendación XML (también conocido como especificación) http://www.w3.org/TR/2000/REC-xml-20001006 contornos que los personajes no están permitidas y debe ser escapado


2.2 Caracteres

[Definición: Una entidad analizada contiene texto, una secuencia de caracteres, que pueden representar marcado o datos de caracteres.] [Definición: Un carácter es una unidad de texto atómica según lo especificado en ISO/IEC 10646 [ISO/IEC 10646] (ver también [ISO/IEC 10646-2000]). Los caracteres legales son tabulación, retorno de carro, avance de línea y los caracteres legales de Unicode e ISO/IEC 10646. Las versiones de estos estándares citados en A.1 Referencias normativas estaban vigentes en el momento en que se preparó este documento. Se pueden agregar nuevos caracteres a estos estándares mediante enmiendas o nuevas ediciones. En consecuencia, los procesadores XML deben aceptar cualquier carácter en el rango especificado para Char. El uso de "caracteres de compatibilidad", tal como se define en la sección 6.8 de [Unicode] (véase también el D21 en la sección 3.6 de [Unicode3]), no se recomienda.]

intervalo de caracteres

[2]  Char  ::=  #x9 | #xA | #xD | [#x20-#xD7FF] | 
      [#xE000-#xFFFD] | [#x10000-#x10FFFF]  
    /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */ 

El mecanismo para la codificación de puntos de código de caracteres en patrones de bits puede variar de una entidad a otra. Todos los procesadores XML deben aceptar las codificaciones UTF-8 y UTF-16 de 10646; los mecanismos para señalar cuál de los dos está en uso, o para poner otras codificaciones en juego, se discuten más adelante, en 4.3.3 Codificación de caracteres en Entidades.


1

XML es un formato y caracteres de control no imprimibles legibles están prohibidos. Puede usar códigos de entidades de caracteres decimales como & # 30; para representarlos, o base-64 codificar el contenido.

1

Como no dio ningún detalle, voy a adivinar que su propiedad es del tipo System.String. Si es así, entonces no puedes serializarlo tal como está. En su lugar, debe serializarlo como un byte []:

[XmlRoot("root")] 
public class HasBase64Content 
{ 
    [XmlIgnore] 
    public string Content { get; set; } 

    [XmlElement("Content")] 
    public byte[] Base64Content 
    { 
     get 
     { 
      return System.Text.Encoding.UTF8.GetBytes(Content); 
     } 
     set 
     { 
      if (value == null) 
      { 
       Content = null; 
       return; 
      } 

      Content = System.Text.Encoding.UTF8.GetString(value); 
     } 
    } 
} 
2

sé que esto es una cuestión de edad, pero he encontrado un enlace y iam publicar aquí, será útil para que venir a través de esta pregunta. Funcionó para mí

http://seattlesoftware.wordpress.com/2008/09/11/hexadecimal-value-0-is-an-invalid-character/

y el código de ese sitio.(En caso de que si el sitio se cae)

/// <summary> 
/// Remove illegal XML characters from a string. 
/// </summary> 
public string SanitizeXmlString(string xml) 
{ 
if (xml == null) 
{ 
    throw new ArgumentNullException("xml"); 
} 

StringBuilder buffer = new StringBuilder(xml.Length); 

foreach (char c in xml) 
{ 
    if (IsLegalXmlChar(c)) 
    { 
     buffer.Append(c); 
    } 
} 

return buffer.ToString(); 
} 

/// <summary> 
/// Whether a given character is allowed by XML 1.0. 
/// </summary> 
public bool IsLegalXmlChar(int character) 
{ 
return 
(
    character == 0x9 /* == '\t' == 9 */   || 
    character == 0xA /* == '\n' == 10 */   || 
    character == 0xD /* == '\r' == 13 */   || 
    (character >= 0x20 && character <= 0xD7FF ) || 
    (character >= 0xE000 && character <= 0xFFFD ) || 
    (character >= 0x10000 && character <= 0x10FFFF) 
); 
} 
1

Si los datos no permite que los personajes de la Control Picture bloque de Unicode, se puede mantener la legibilidad humana mediante la sustitución de los caracteres de control sobre la serialización y de vuelta otra vez sobre la deserialización.

A continuación se presentan los personajes:

␀ ␁ ␂ ␃ ␄ ␅ ␆ ␇ ␈ ␉ ␊ ␋ ␌ ␍ ␎ ␏

␐ ␑ ␒ ␓ ␔ ␕ ␖ ␗ ␘ ␙ ␚ ␛ ␜ ␝ ␞ ␟

␠ ␡

Esperemos que se muestren en su navegador y editores. Incluso si no lo hacen, son legales en XML.

Cuestiones relacionadas