Pregunta

Tengo un problema deserializar algunos XML; el XML suministrado por un tercero es bastante detallado, por lo que si no existe un conjunto valor para un elemento particular, se suministrará y elemento vacío (por ejemplo <element1 />).

Este es un problema para ciertos elementos, por ejemplo, aquellos que están destinados a números enteros de la tienda. Tengo control sobre el tercero, por lo que podría o bien conseguir que especifican un valor predeterminado (<myinteger>0</myinteger>) o puedo conseguir que se omiten estos elementos en su totalidad. Ambos deben evitar el problema.

Sin embargo, puede haber situaciones en el futuro, en el que no tenemos tanto control - en cuyo caso, ¿hay una forma de especificar, quizás a través de una decoración, un valor por defecto

    [XmlElement("myinteger")=0???]
    public int MyInteger
    {
        get
        {
            return myInteger;
        }
        set
        {
            myInteger= value;
        }
    }
¿Fue útil?

Solución

XmlSerializer hace [DefaultValue] apoyo, pero lo utiliza durante serialización . Durante deserialización , simplemente ejecuta el constructor, a continuación, toma valores entrantes y las aplica. Un enfoque común, entonces, es utilizar el constructor (o en el campo-inicializadores):

public Foo() {
    Bar = 4;
}
[DefaultValue(4), XmlAttribute("bar")]
public int Bar {get;set;}

No obstante ; La interpretación de XmlSerializer de esto no es "suministrar un elemento vacío" -, sino más bien "omitir el elemento (/ atributo)". int? aun no se asigna a "vaciar". Para mango vacío elementos, que tendría que manejarlo como una cadena. ¿Qué es feo.

Otros consejos

Decoración usando [DefaultValue] no parece ser una solución completa, ya que no funciona siempre. Otra solución sencilla (Puede no estar limpio)

public string _sourceSubFolderName;
    [DefaultValueAttribute("")]
    [XmlElement("SourceSubFolderName")]
    public string SourceSubFolderName
    {
        get { return string.IsNullOrEmpty(_sourceSubFolderName) ? 
               string.Empty : _sourceSubFolderName; }
        set { _sourceSubFolderName = value; }
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top