问题 不区分大小写的反序列化


我有一个XML文件

我们已经定义了类来序列化或反序列化XML。

当我们反序列化时,如果XML包含如下所示“类型“属性是大写的,它的抛出错误就像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时是否可以忽略大小写?


12859
2017-10-20 06:46


起源

你能否完整地发布错误?此外,在发布代码时,如果您使用小101010按钮正确格式化它是好的。 - Mia Clarke
@Banang:修正了格式化问题 - Merlyn Morgan-Graham
@Merlyn Morgan-Graham:谢谢! - Mia Clarke
@Mehendra babu,没有看到错误,很难知道什么是错的,但我认为这可能是命名空间冲突的情况(名称“类型”在这里感觉像一个可能的罪犯)。 msdn.microsoft.com/en-us/magazine/cc164122.aspx - Mia Clarke
你的问题不清楚,因为它是 值 具有案例问题的属性。 - Anton Tykhyy


答案:


定义的值 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) ; }
}

7
2018-03-05 19:26





对于属性,您还可以简单地评估“伪造枚举”

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

这适用于XML序列化和反序列化。 序列化使用主要定义,而反序列化可以使用两者。 它有一些副作用,特别是当您或通过Enum.Values或类似枚举时。 但如果你知道自己在做什么就行之有效


7
2017-07-12 10:34



这不仅适用于属性值(即 type="GRANDDAD")?它也适用于属性名称(即 tYpE="GrandDad")?完整的例子是什么样的? - bzlm
这是一个聪明的伎俩! - Literal


我认为简短的答案是否定的,你不能忽视XmlAttributes中的大小写,因为它们区分大小写(见本文) 文章)。这意味着如果您的文档是混合大小写,那么您将遇到许多问题(其中一个是这个问题)。

如果是属性名称 类型 在所有文档以大写形式存储时,您不仅可以更改XmlAttribute以反映它的存储方式,因此将行更改为:

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

或者那不起作用?如果没有,在当前情况下我不确定是否有解决方案。


2
2017-10-20 07:04



+1,因为XML区分大小写。没有完全回答问题(如何),但确实指导询问者采用正确的解决方案。 - Merlyn Morgan-Graham
@Merlyn,对不起,我意识到在编辑中期也是如此。同时您也编辑了问题,因此现在可以看到更多原始代码(当时示例XML文档甚至没有显示) - Paul Hadfield
-1的任何原因? - Paul Hadfield
我讨厌当人们投票,并且不评论所以我可以解决它= P - Merlyn Morgan-Graham