2010-10-20 17 views
11

Ho un file XML in cui Caso deserializzazione insensibile

Abbiamo definito le classi di serializzare o deserializzare XML.

Quando deserializziamo, se l'XML contiene come sotto l'attributo "tipo" è in maiuscolo, il suo errore di lancio è come c'è un errore in xml (2,2) come quello.

<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 
} 

questo è il modo che abbiamo definito l'attributo.

È possibile ignorare il caso durante la deserializzazione di XML?

+0

Potresti postare l'errore nella sua interezza? Inoltre, quando si pubblica un codice, è opportuno utilizzare il pulsante 101010 per formattarlo correttamente. –

+0

@Banang: risolta la formattazione –

+0

@ Morgan Morgan-Graham: Grazie! –

risposta

2

Penso che la risposta breve sia no, non è possibile ignorare il caso in XmlAttributes poiché sono case sensitive (vedere questo article). Ciò significa che si verificheranno molti problemi (di cui questo è uno solo) se si hanno documenti in arrivo con casi misti.

Se il nome dell'attributo Tipo in tutti i documenti vengono memorizzati in maiuscolo si può non solo cambiare il XmlAttribute per riflettere come viene memorizzato, in modo da modificare la linea a:

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

Or non funzionerebbe? Altrimenti, nello scenario attuale non sono sicuro che esista una soluzione.

+0

+1, poiché l'XML è sensibile al maiuscolo/minuscolo. Non risponde completamente alla domanda (come), ma indirizza il richiedente verso la soluzione giusta. –

+0

@Merlyn, scusami mi sono reso conto che era a metà modifica. Nel frattempo hai anche modificato la domanda, quindi ora è visibile più del codice originale (nel momento in cui il documento XML di esempio non veniva nemmeno visualizzato) –

+0

Qualche motivo per il -1? –

7

Definire i valori della DocumentType censimento nel il maiuscolo o utilizzare lo standard trucco proprietà adattatore:

[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

Per attributo è possibile calcolare semplicemente "falsificare l'enum"

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

questo funziona in serializzazione e deserializzazione XML. La serializzazione utilizza le definizioni principali, mentre la deserializzazione può funzionare con entrambe. Ha qualche effetto collaterale, specialmente quando o se si enumera attraverso Enum.Values ​​o simili. Ma se sai cosa stai facendo è efficace

+2

Questo non funzionerà solo per i valori degli attributi (ad esempio 'type =" GRANDDAD "')?Funzionerà anche per i nomi degli attributi (ad esempio 'tYpE =" GrandDad "')? Come appare l'esempio completo? – bzlm

+0

È un trucco così intelligente! – Literal

Problemi correlati