【问题标题】:How to parse enum string & value from XML model to object如何将枚举字符串和值从 XML 模型解析为对象
【发布时间】:2018-06-13 12:59:34
【问题描述】:

问题:如何将枚举字符串和值从 XML 模型解析为对象。

错误:无法将枚举值从 XML 解析到对象模型。

我尝试仅解析枚举值,但无法解析为模型。我尝试了一些解决方案,但我仍然遇到问题,请帮助建议!感谢您的支持!

  • 枚举:

    public enum DocumentType
    {
        DocumentType_A = 0,
        DocumentType_B = 1,
        DocumentType_C = 2
    }
    
  • XML:

【问题讨论】:

  • 将 XML 发布为 text,发布您用于反序列化的代码。发布目标 C# 类。
  • 我猜这个数字来自外部 API 之类的东西?您可以使用 int 类型的分隔属性和一些 XmlIgnore 属性来解决这个问题,这些属性只是读取/写入该字段,基本上是手动解析。
  • @X39 我想从 XML 文件中读取值。在这种情况下如何使用 XmlIgnore 读取值?请分享一些例子。谢谢!
  • @HuuHa 很高兴知道您到底在做什么,您是手动阅读文档还是将其序列化为某个对象?提供一些最小可行示例,正确答案应该相当接近
  • 下面这个反序列化方法如何解析文档类型: Document overview = (Document)reader.Deserialize(file);公共类文档 { 公共长文档 ID { 获取;放; } 公共文档类型类型{ 获取;放; } }

标签: c# xml parsing enums xml-parsing


【解决方案1】:

先从 XML 中获取节点,然后解析为枚举。

const string str = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Document><DocumentId>1</DocumentId><Attachment></Attachment><Metadata><DocumentType>0</DocumentType></Metadata></Document>";
var xml = new XmlDocument();
xml.LoadXml(str);

var node = xml.DocumentElement.SelectSingleNode("/Document/Metadata/DocumentType").InnerText;
DocumentType currentEnum = (DocumentType)Enum.Parse(typeof(DocumentType), node);
int currentEnumId = (int)currentEnum;

基于 cmets 的更新 - 使用枚举将 xml 反序列化为对象

XML

<?xml version="1.0" encoding="utf-8"?>
<Document>
<DocumentId>1</DocumentId>
<Attachment></Attachment>
<Metadata>
    <DocumentType>1</DocumentType>
</Metadata>
</Document>

型号

    public class Document 
    { 
        public long DocumentId { get; set; } 

        public Metadata Metadata { get; set; } 
    }

    public class Metadata
    {

        public string DocumentType  { get; set; } 

        public DocumentType Type 
        {
            get
            {
                return (DocumentType)Enum.Parse(typeof(DocumentType), DocumentType);
            }
        }

    }

    public enum DocumentType 
    { 
        DocumentType_A = 0, 
        DocumentType_B = 1, 
        DocumentType_C = 2 
    };

将 XML 转换为对象:

    var serializer = new XmlSerializer(typeof(Document)); 
    using (var reader = XmlReader.Create("/Users/brunomartinspro/Desktop/myxml.xml")) 
    { 
        Document document = (Document)serializer.Deserialize(reader); 
        var mySuperType = document.Metadata.Type; 
    }

【讨论】:

  • 这样Enum.Parse("0")
  • 下面这个反序列化方法如何解析文档类型: Document overview = (Document)reader.Deserialize(file);公共类文档 { 公共长文档 ID { 获取;放; } 公共文档类型类型{ 获取;放; } }
  • @bommelding 但你仍然得到枚举 :)
  • @BrunoMartinsPro:你对这个案例有什么解决方案/想法吗?
  • 非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
相关资源
最近更新 更多