Question

Hé les gars, j'ai une application qui enregistre les données en utilisant XML. J'ai récemment reçu un rapport de bogue d'un utilisateur qui est incapable d'ouvrir son fichier de données. L'analyseur apparemment échoué quand il a rencontré un mauvais caractère.

Heureusement, j'ai une copie de son fichier de données, donc je suis en mesure de trouver le coupable, mais je ne comprends pas ce qu'elle est, ou comment il est arrivé là. (. Comme c'est toutes les entrées du clavier de l'utilisateur) Les caractères incriminés sont:

attributeName="Some text then XXX"

Si le "XXX" est, selon un éditeur hexadécimal:

0A 0A 00

Le 0A est un saut de ligne pour autant que je peux dire, mais comment diable aurait un caractère nul finissent par là ?! Ceci est le premier bug que je l'ai vu de cette nature.

Était-ce utile?

La solution

Je pense que le problème que vous voyez est un défaut peu connu, mais très sérieux en XML. En bref: Les valeurs xml ne peuvent pas contenir certains caractères, et non seulement ils ne peuvent pas être dans le texte xml, mais ils ne peuvent même pas être échappés en utilisant & # DDDD; notation.

pourrait être trouvé charset XML valide ici: http://www.w3.org / TR / REC-xml / # charsets , et il est: # x9 | #xA | #xD | [# X20- # xD7FF] | [# XE000- # xFFFD] | [# X10000- # x10FFFF].

Cela signifie que si votre chaîne a un caractère non inclus dans ce jeu de caractères, il ne peut pas être en valeur sérialisé XML. La seule façon de stocker cette chaîne est de sérialisation à base64 sous forme de données binaires.

De nombreux cadres populaires, y compris MSXML et .NET permettrait de mettre de mauvaises données dans les valeurs XML, et serait alors refuser de désérialiser XML tel. Voici un exemple, capture d'écran: http://vvcap.net/db/Db94W-13uwCkNXSZTitO.htp, et le code source:

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);
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top