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

Posted

技术标签:

【中文标题】如何正确地将 XML 内容映射到 C# 中的 DTO 属性【英文标题】:How to properly map XML content to DTO property in C# 【发布时间】:2022-01-18 16:02:11 【问题描述】:

我有一个 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属性不区分大小写?

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

【问题讨论】:

您可以在一次性项目或测试项目中试用此代码,这样您就不会对现有代码库进行巨大更改。 SupportedEventTypes 应该是 InvestigateEventType[] 而不是 SupportedEventType[] @phuzi 谢谢,错字 @Crowcoder 我不是要求调试我的代码,也不是在寻找捷径。我在问是否有人解决了类似的问题或有想法 @thebugsdontwork 成功了!如果你愿意,也许你可以发布一个答案。 【参考方案1】:

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

根据您的代码示例,您已经知道,您可以将属性添加到对象和对象属性中,这些属性告诉 XML 序列化程序在 XML 中查找该特定属性的内容。

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

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

【讨论】:

以上是关于如何正确地将 XML 内容映射到 C# 中的 DTO 属性的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地将 C 数组传递给 C#?

如何正确地将 RealmDB 结果对象映射到 SwiftUI 列表?

如何知道 docker 容器中的哪些数据能够正确地将其映射为卷

如何将 XML 映射到 C# 对象

如何正确地将浮点指针从 C 库传递到其 C# 包装器

C# 如何读取xml文件并输出信息到label上