Нечувствительность к регистру
У меня есть 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; }
Или это не сработает? Если нет, в текущем сценарии я не уверен, что есть решение.