如何在 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; }
给定 InvestigateEventType
,XMLSerializer
应将其内容读入 Name
属性 并将 IsDefault
属性读入 IsDefault
属性 .
如何实现?
如何使 IsDefault
属性不区分大小写?
我还没有尝试过这段代码,因为构建它需要大量的更改,我正在寻求预先的帮助。
有时这些(反)序列化器需要在正确的方向上稍微推动一下,以便将正确的数据放入您的对象中。虽然 JSON 结构松散,但 XML 文件往往具有更严格的结构。不一定是设计,而是使用。
正如您已经知道的那样,根据您的代码示例判断,您可以将属性添加到您的对象和对象属性中,这些属性告诉 XML 序列化程序在 XML 中为特定 属性.
嵌入式对象还可以包含 XML 序列化程序的指令。因此,在嵌入对象的属性前添加 [XmlAttribute("IsDefault")]
(告诉 XML 序列化程序查找 XML 元素的属性“IsDefault”(如果存在)和 [XmlText]
(告诉XML 序列化器获取 XML 元素内的文本)将使 XMLSerializer 的生活更轻松。
这不仅让您和 XMLSerializer 都清楚它在寻找什么,还可以提高搜索性能,因为这可以防止 XMLSerializer 盲目地开始查询您的 属性 可能居住的所有可能地方。
我有一个 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; }
给定 InvestigateEventType
,XMLSerializer
应将其内容读入 Name
属性 并将 IsDefault
属性读入 IsDefault
属性 .
如何实现?
如何使 IsDefault
属性不区分大小写?
我还没有尝试过这段代码,因为构建它需要大量的更改,我正在寻求预先的帮助。
有时这些(反)序列化器需要在正确的方向上稍微推动一下,以便将正确的数据放入您的对象中。虽然 JSON 结构松散,但 XML 文件往往具有更严格的结构。不一定是设计,而是使用。
正如您已经知道的那样,根据您的代码示例判断,您可以将属性添加到您的对象和对象属性中,这些属性告诉 XML 序列化程序在 XML 中为特定 属性.
嵌入式对象还可以包含 XML 序列化程序的指令。因此,在嵌入对象的属性前添加 [XmlAttribute("IsDefault")]
(告诉 XML 序列化程序查找 XML 元素的属性“IsDefault”(如果存在)和 [XmlText]
(告诉XML 序列化器获取 XML 元素内的文本)将使 XMLSerializer 的生活更轻松。
这不仅让您和 XMLSerializer 都清楚它在寻找什么,还可以提高搜索性能,因为这可以防止 XMLSerializer 盲目地开始查询您的 属性 可能居住的所有可能地方。