2012-02-27 14 views
7

Duplicar posible:
Why are “control” characters illegal in XML?
Saving an escape character 0x1b in an XML file¿Por qué el serializador XML arroja una excepción de carácter no válido cuando el carácter está dentro de CDATA?

Esto arroja una excepción ArgumentException:

var c = '\x1A'; 

    var xml = new XDocument(
       new XDeclaration("1.0", "utf-8", null), 
       new XElement("test", new XCData(c.ToString())) 
      ); 

    var foo = xml.ToString(); // ArgumentException 

¿Por qué es .Net lanzando esta excepción? Estoy envolviendo el personaje ilegal en CDATA, así que habría pensado que los personajes ilegales serían manejados por mí. Este también es el caso para muchos otros personajes (por ejemplo, 0x1B, 0x1C, 0x1E, 0x1E, 0x1F).

¿Cómo se soluciona este problema?

+4

Consulte estas preguntas: [Cómo guardar un carácter de escape 0x1b en un archivo XML] (http://stackoverflow.com/questions/4134438/saving-an-escape-character-0x1b-in-an-xml-file) y [¿Por qué los caracteres de "control" son ilegales en XML?] (Http://stackoverflow.com/questions/404107/why-are-control-characters-illegal-in-xml). Workaraund sería utilizar codificación Base64 antes de guardar en un XML. – oleksii

+0

@oleksii Debe convertir esto en una respuesta, porque es la respuesta correcta. – Bevan

+0

@Bevan: No, en realidad la pregunta debe cerrarse como un duplicado. –

Respuesta

0

No creo que SecurityElement.Escape funcione porque \ x1A es un código de control - no hay una entidad válida xml para sustituir.

Consulte este list of valid XML characters para obtener más detalles.

-1

Intente almacenar sus datos xml como datos de escape utilizando SecurityElement del espacio de nombres System.Security. Más información se puede encontrar here

string xmlData = SecurityElement.Escape(xmlData); 

caracteres XML no válidos pueden ser escritas por la creación de la XDocument con XmlWriterSettings establecidos con la propiedad CheckCharacters establecido en false. Esto los reemplazará con caracteres numéricos como & # 0; - & # 0x1F. Vea el artículo this para más detalles. También como alternativa puede llamar a algún método de limpieza xml como this one.

+0

Eso no funciona. Aún obtengo una ArgumentException para character \ x1A incluso después de usar SecurityElement.Escape. –

+0

puede por favor mostrar cómo lo usó en su contexto –

+1

Los caracteres de control no están permitidos en XML pase lo que pase. –

Cuestiones relacionadas