Нечувствительность к регистру

У меня есть XML файл, где

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

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

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

...

[DescriptionAttribute("The sharepoint 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?

Ответ 1

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

[Description  ("The sharepoint 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) ; }
}

Ответ 2

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

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

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

Ответ 3

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

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

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

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