【问题标题】:How to properly map XML content to DTO property in C#如何正确地将 XML 内容映射到 C# 中的 DTO 属性
【发布时间】: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 成功了!如果你愿意,也许你可以发布一个答案。

标签: c# xmlserializer


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2015-11-29
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2012-03-09
    • 1970-01-01
    • 2022-08-04
    相关资源
    最近更新 更多