2010-10-20 3 views
11

У меня есть файл XML, где без учета регистра Десериализация

Мы определили классы для сериализации или десериализации XML.

Когда мы deserialize, если XML содержит, как показано ниже, где «type» атрибут находится в верхнем регистре, его ошибка бросания, как и ошибка в xml (2,2).

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

это то, как мы определили атрибут.

Можно ли игнорировать регистр при десериализации XML?

+0

Не могли бы вы высказать всю эту ошибку? Кроме того, при отправке кода хорошо, если вы используете маленькую кнопку 101010, чтобы отформатировать ее правильно. –

+0

@Banang: Исправлено форматирование –

+0

@Merlyn Morgan-Graham: Спасибо! –

ответ

2

Я думаю, что короткий ответ - нет, вы не можете игнорировать регистр в XmlAttributes, поскольку они чувствительны к регистру (см. Это article). Это означает, что у вас будет много проблем (из которых это одно), если у вас есть документы, входящие в смешанный случай.

Если имя атрибута Тип во всех документы хранятся в верхнем регистре можно не только изменить XmlAttribute, чтобы отразить, как она хранится, поэтому измените строку:

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

Or это не сработает? Если нет, то в текущем сценарии я не уверен, что есть решение.

+0

+1, поскольку XML чувствителен к регистру. Не полностью отвечает на вопрос (как), но направляет enquirer к правильному решению. –

+0

@Merlyn, извините, я понял, что так было в середине редактирования. В то же время вы также отредактировали вопрос, так что теперь больше видно из исходного кода (на тот момент, когда пример XML-документа даже не показывался) –

+0

Любая причина для -1? –

7

Определить значения DocumentType перечисления в верхнем регистре или использовать стандартный трюк адаптер свойства:

[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

Для атрибута можно также оценивать просто «фальсифицируя перечисление»

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

это работает в XML-сериализации и десериализации. Сериализация использует основные определения, в то время как десериализация может работать с обоими. У него есть побочный эффект, особенно когда вы перечисляете через Enum.Values ​​или подобное. Но если вы знаете, что вы делаете, это эффективно

+2

Не будет ли это работать только для значений атрибутов (т. Е. 'Type =" GRANDDAD "')?Будет ли он работать и для имен атрибутов (т. Е. 'TYpE =" GrandDad "')? Как выглядит полный пример? – bzlm

+0

Это такой умный трюк! – Literal

Смежные вопросы