2010-10-20 10 views
11

que tiene un archivo XML donde Caso Deserialización insensibles

Hemos definido clases para serializar o deserializar XML.

Cuando deserializamos, si el XML contiene a continuación donde el atributo "tipo" está en mayúscula, es un error de lanzamiento como que hay un error en xml (2,2) como ese.

<document text="BlankPDF" name="BlankPDF" type="PDF" path="" /> 

...

[DescriptionAttribute("The sharepoint's document type.")] 
[XmlAttribute("type")] 
public DocumentType Type 
{ 
    get; 
    set; 
} 

public enum DocumentType 
{ 
    pdf, 
    ppt, 
    pptx, 
    doc, 
    docx, 
    xlsx, 
    xls, 
    txt, 
    jpg, 
    bmp, 
    jpeg, 
    tiff, 
    icon 
} 

así es como hemos definido el atributo.

¿Es posible ignorar el caso al deserializar XML?

+0

¿Podría por favor publicar el error en su totalidad? Además, al publicar el código, es bueno si usa el pequeño botón 101010 para formatearlo correctamente. –

+0

@Banang: Se corrigió el formato –

+0

@Merlyn Morgan-Graham: ¡Gracias! –

Respuesta

2

Creo que la respuesta corta es no, no se puede ignorar en caso XmlAttributes ya que son mayúsculas y minúsculas (ver este article). Esto significa que se encontrará con muchos problemas (de los cuales este es uno) si tiene documentos que entran con un caso mixto.

Si el nombre del atributo Tipo en todos los documentos se almacenan en mayúsculas se puede no sólo cambiar la XmlAttribute para reflejar la forma en que se almacena, por lo que cambiar la línea a:

[DescriptionAttribute("The sharepoint's document type.")] [XmlAttribute("**TYPE**")] 
public DocumentType Type { get; set; } 

O ¿Eso no funcionaría? Si no, en el escenario actual no estoy seguro de que haya una solución.

+0

+1, ya que XML distingue entre mayúsculas y minúsculas. No responde completamente la pregunta (cómo), pero dirige al investigador hacia la solución correcta. –

+0

@Merlyn, lo siento, me di cuenta de que también estaba a mitad de edición. Mientras tanto, ha editado la pregunta también, por lo que ahora se puede ver más código original (en el momento en que el documento XML de ejemplo no se mostraba) –

+0

¿Alguna razón para el -1? –

7

Definir los valores de la DocumentType enumeración en la mayúscula o utiliza el estándar truco propiedad adaptador:

[Description ("The sharepoint's document type.")] 
[XmlIgnore] 
public DocumentType Type { get; set; } 

[Browsable (false)] 
[XmlAttribute ("type")] 
public string TypeXml 
{ 
    get { return Type.ToString().ToUpperInvariant() ; } 
    set { Type = (DocumentType) Enum.Parse (typeof (DocumentType), value, true) ; } 
} 
6

Para atributo que puede también evaluar simplemente "falsificar la enumeración"

public enum RelativeType 
    {   
     Mum, 
     Dad, 
     Son, 
     GrandDad, 
// ReSharper disable InconsistentNaming 
     MUM = Mum, 
     DAD = Dad, 
     SON = Son, 
     GRANDDAD = GrandDad 
// ReSharper restore InconsistentNaming 
    } 

Estos trabajos en Serialización y Deserialización XML. La serialización utiliza las definiciones principales, mientras que la deserialización puede funcionar con ambas. Tiene algunos efectos secundarios, especialmente cuando enumera a través de Enum.Values ​​o similar. Pero si sabe lo que está haciendo es efectivo

+2

¿No funcionará esto solo para los valores de los atributos (es decir, 'type =" GRANDDAD "')?¿Funcionará también para nombres de atributos (es decir, 'tYpE =" GrandDad "')? ¿Cómo se ve el ejemplo completo? – bzlm

+0

¡Es un truco tan ingenioso! – Literal

Cuestiones relacionadas