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

How to properly map XML content to DTO property in C#

我有一个 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; }

根据上面的文档,SupportedEventTypes 将包含 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; }

给定 InvestigateEventTypeXMLSerializer 应将其内容读入 Name 属性 并将 IsDefault 属性读入 IsDefault 属性 .

如何实现?

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

我还没有尝试过这段代码,因为构建它需要大量的更改,我正在寻求预先的帮助。

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

正如您已经知道的那样,根据您的代码示例判断,您可以将属性添加到您的对象和对象属性中,这些属性告诉 XML 序列化程序在 XML 中为特定 属性.

嵌入式对象还可以包含 XML 序列化程序的指令。因此,在嵌入对象的属性前添加 [XmlAttribute("IsDefault")](告诉 XML 序列化程序查找 XML 元素的属性“IsDefault”(如果存在)和 [XmlText](告诉XML 序列化器获取 XML 元素内的文本)将使 XMLSerializer 的生活更轻松。

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