Pregunta

Hola chicos, tengo una aplicación que guarda los datos utilizando XML. Recientemente he recibido un informe de error de un usuario que no es capaz de abrir su archivo de datos. El analizador aparentemente falló cuando se encontró con un mal carácter.

Afortunadamente, tengo una copia de su archivo de datos, así que fue capaz de encontrar el culpable, pero no entiendo lo que es, o cómo llegó hasta allí. (Como este es todo la entrada de teclado del usuario.) Los caracteres infractores son:

attributeName="Some text then XXX"

Cuando el "XXX" es, de acuerdo con un editor hexadecimal:

0A 0A 00

El 0A es un avance de línea por lo que yo puedo decir, pero ¿cómo diablos haría con un carácter nulo final hasta allí ?! Este es el primer error que he visto de esta naturaleza.

¿Fue útil?

Solución

Creo que el problema que se está viendo es un poco conocido, pero falla muy grave en XML. En pocas palabras: los valores XML no pueden contener ciertos caracteres, y no sólo no pueden estar en el texto XML, sino que ni siquiera se pueden usar escaparon & # DDDD; notación.

charset XML válido se puede encontrar aquí: http://www.w3.org / TR / REC-XML / # juegos de caracteres , y es: # x9 | #xA | #xD | [# # X20- xD7FF] | [# # XE000- xFFFD] | [# # X10000- x10FFFF].

Esto significa que si la cadena tiene cualquier carácter no incluido en este conjunto de caracteres, no puede ser serializado en valor XML. La única manera de almacenar dicha cadena es serializar a base 64 como datos binarios.

Muchos marcos populares, incluyendo MSXML y .NET permitiría poner los datos erróneos en los valores XML, y luego se negaría a deserializar tales XML. He aquí un ejemplo, captura de pantalla: http://vvcap.net/db/Db94W-13uwCkNXSZTitO.htp, y el código fuente:

using System;
using System.Xml.Serialization;
using System.Xml;

[Serializable] public class TestClass
{
    [XmlAttribute]
    public string Member { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var ser = new XmlSerializer(typeof(TestClass));
        var tc = new TestClass() { Member = "zzz \x19 zzz" };
        var stream = new System.IO.StringWriter();
        ser.Serialize(stream, tc);
        var xml = stream.ToString();
        var stream2 = new System.IO.StringReader(stream.ToString());
        var tc2 = ser.Deserialize(stream2);
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top