提问者:小点点

如何正确地将XML内容映射到C#中的DTO属性


我有一个XML文档,看起来像

<?xml version="1.0" encoding="utf-8"?>
<DataProviderConfiguration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <FileVersion>1</FileVersion>
  <SupportedEventTypes>
    <InvestigateEventType>TimeBasedRefresh</InvestigateEventType>
    <InvestigateEventType>IdBasedRefresh</InvestigateEventType>
    <InvestigateEventType>FileReceived</InvestigateEventType>
  </SupportedEventTypes>

它被解析为一些DTO:

[XmlArray(nameof(SupportedEventTypes))]
[XmlArrayItem("InvestigateEventType")]
public virtual string[] SupportedEventTypes { get; set; }

给定上面的文档,支持的事件类型将有3个项目。

现在上面的片段包含属性

<SupportedEventTypes>
   <InvestigateEventType>TimeBasedRefresh</InvestigateEventType>
   <InvestigateEventType IsDefault="true">IdBasedRefresh</InvestigateEventType>
   <InvestigateEventType IsDefault="true">FileReceived</InvestigateEventType>
</SupportedEventTypes>

让我们考虑更新的DTO

public class InvestigateEventType
{
   public string Name { get; set; }
   public bool IsDefault { get; set; }
}

[XmlArray(nameof(SupportedEventTypes))]
[XmlArrayItem("InvestigateEventType")]
public virtual InvestigateEventType[] SupportedEventTypes { get; set; }

给定调查事件类型XMLSerializer应将其内容读入Name属性,并将IsDefault属性读入IsDefault属性。

如何让它发生?

如何使IsDefault属性不区分大小写?

我还没有尝试过这个代码,因为构建它需要大量的更改,我需要提前寻求帮助。


共1个答案

匿名用户

有时,这些(反)序列化程序需要在正确的方向上稍微推动一下,以便将正确的数据放入对象中。虽然JSON的结构松散,但XML文件的结构往往更为严格。不一定是通过设计,而是通过使用。

嵌入式对象还可以包含XML序列化程序的说明。因此,在嵌入对象的属性之前添加属性,例如[XmlAtoun(IsDefault)](告诉XML序列化器查找XML元素的属性IsDefault(如果存在))和[XmlText](告诉XML序列化器抓取其中的文本XML元素)将使XMLSerializer的工作更轻松。

这不仅让您和XMLSerializer都清楚它在寻找什么,还可以提高搜索性能,因为这可以防止XMLSerializer盲目地开始查询您的属性可能驻留的所有可能位置。