Frage

Hey Jungs, ich habe eine Anwendung, die Daten unter Verwendung von XML gespeichert. Vor kurzem erhielt ich einen Fehlerbericht von einem Benutzer, der nicht in der Lage ist, ihre Datendatei zu öffnen. Der Parser offenbar versagt, wenn es ein schlechtes Zeichen gefunden.

Zum Glück hat ich eine Kopie ihrer Datendatei, so ich in der Lage war, die Schuldigen zu finden, aber ich verstehe nicht, was es ist oder wie es dort ankommt. (Da es sich um alle Tastatureingaben vom Benutzer.) Die säumigen Zeichen sind:

attributeName="Some text then XXX"

Wenn das "XXX" ist nach einem Hex-Editor:

0A 0A 00

Die 0A ist ein Zeilenvorschub, soweit ich das beurteilen kann, aber wie zum Teufel würde ein Null-Zeichen Ende dort oben ?! Dies ist der erste Fehler, den ich diese Art gesehen habe.

War es hilfreich?

Lösung

Ich denke, das Problem, dass Sie sehen, ein wenig ist bekannt, aber sehr schwere Fehler in XML. Auf den Punkt gebracht: xml-Werte enthalten, können nicht bestimmte Zeichen, und nicht nur sie in XML-Text kann nicht sein, aber sie können mit & # DDDD nicht einmal entwertet werden; Notation.

Gültige XML-charset hier gefunden werden: http://www.w3.org / TR / REC-xml / # charsets , und es ist: # x9 | #xA | #xD | [# X20- # xD7FF] | [# XE000- # xFFFD] | [# X10000- # x10FFFF].

Das bedeutet, dass, wenn die Zeichenfolge ein beliebiges Zeichen hat nicht in diese charset enthalten, kann es nicht in XML-Wert serialisiert werden. Der einzige Weg, solche Zeichenfolge zu speichern, ist es zu base64 als binären Daten serialisiert werden.

Viele beliebte Frameworks, einschließlich MSXML und .NET würde schlechte Daten in die XML-Werte erlauben setzen, und dann verweigern, XML deserialisieren. Hier ist ein Beispiel, Screenshot: http://vvcap.net/db/Db94W-13uwCkNXSZTitO.htp und Quellcode:

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);
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top