Frage

Ich bin mit XmlSerializer ein Objekt zu XML in C # schreiben und zu lesen. Ich verwende derzeit die Attribute XmlElement und XmlIgnore die Serialisierung des Objekts zu manipulieren.

Wenn meine XML-Datei ist ein XML-Element fehlt, das ich benötige, mein Objekt noch deserialisiert (xml -> Objekt) just fine. Wie zeige I (vorzugsweise über Attribute), dass ein bestimmtes Feld „erforderlich“?

Hier ist ein Beispiel-Methode von dem, was ich bin derzeit mit:

[XmlElement(ElementName="numberOfWidgets")]
public int NumberThatIsRequired {
    set ...;
    get ...;
}

Meine ideale Lösung wäre so etwas wie ein XmlRequired Attribut hinzufügen.

Außerdem gibt es eine gute Referenz für welche Attribute zur Verfügung, das Verhalten von XmlSerializer zu manipulieren?

War es hilfreich?

Lösung

Ich habe eine Antwort für den zweiten Teil bekommt: "Attribute, die Steuer XML-Serialisierung" .

Untersuchung noch den ersten Teil ...

EDIT: Ich vermute stark, können Sie diese durch XML nicht Deserialisierung selbst. Ich habe laufen nur xsd.exe auf einem Beispielschema, das ein erforderliches Attribut enthält - und es ist genau das gleiche, wenn das Attribut als optional markiert. Wenn es eine Möglichkeit gäbe Eigenschaften erfordern, eingestellt werden, würde ich erwarten, dass es in diesem Fall umgesetzt werden.

Ich vermute, dass Sie im Grunde nur haben zu Ihrem Baum von Objekten zu bestätigen, nachdem es deserialisiert. Tut mir leid, dass ...

Andere Tipps

Die einzige Möglichkeit, die ich gefunden habe, dies zu tun ist über XSD. Was Sie tun können, ist zu validieren, während Sie deserialisieren:

static T Deserialize<T>(string xml, XmlSchemaSet schemas)
{
    //List<XmlSchemaException> exceptions = new List<XmlSchemaException>();
    ValidationEventHandler validationHandler = (s, e) =>
    {
        //you could alternatively catch all the exceptions
        //exceptions.Add(e.Exception);
        throw e.Exception;
    };

    XmlReaderSettings settings = new XmlReaderSettings();
    settings.Schemas.Add(schemas);
    settings.ValidationType = ValidationType.Schema;
    settings.ValidationEventHandler += validationHandler;

    XmlSerializer serializer = new XmlSerializer(typeof(T));
    using (StringReader sr = new StringReader(xml))
        using (XmlReader books = XmlReader.Create(sr, settings))
           return (T)serializer.Deserialize(books);
}

Für Erweiterbarkeit Gründen ist XmlSerializer sehr nachsichtig, wenn es um die Deserialisierung kommt; Dinge wie [DefaultValue], ShouldSerialize{Foo} und {Foo}Specified sind vor allem verwendet, um während Serialisierung (Ausnahme {Foo}Specified, die während der Deserialisierung sowie abgefragt während der Serialisierung eingestellt ist).

Als solche; es gibt keine einfache Möglichkeit, dies zu tun, es sei denn, Sie IXmlSerializable implementieren und do it yourself. damagednoob zeigt eine XSD-Option, die auch eine Option ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top