You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# XML映射失效求助:反序列化后部分字段为空或无数据

修正C# XML反序列化实体类映射问题

以下是针对你遇到的Setup/Transaction字段为null、Identities/Charges数组无数据问题的具体修正方案:

核心问题排查与修复步骤

1. 匹配XML元素与实体类属性名称

XML是大小写敏感的,若XML元素名称和类属性名称不一致,必须通过[XmlElement]特性显式指定对应关系。

2. 正确映射嵌套对象

嵌套的类需声明为public,其内部属性同样要标记对应的XML特性,否则反序列化时无法识别嵌套结构。

3. 数组/集合的专属映射配置

对于XML中的数组节点,需用[XmlArray]标记父节点名称,[XmlArrayItem]标记子元素名称;同时集合属性需使用可实例化的类型(如List<T>),避免反序列化后为null。

4. 提前初始化集合

在实体类构造函数中初始化集合,确保反序列化后集合不会是null值。

示例代码

假设你的XML结构如下:

<Root>
  <Setup>
    <File>order.xml</File>
    <SequenceNumber>456</SequenceNumber>
  </Setup>
  <Transaction>
    <TransactionId>TXN-20240501</TransactionId>
  </Transaction>
  <Identities>
    <Identity>
      <UserId>user_001</UserId>
      <UserName>John Doe</UserName>
    </Identity>
  </Identities>
  <Charges>
    <Charge>
      <ItemId>item_100</ItemId>
      <Amount>99.99</Amount>
    </Charge>
  </Charges>
</Root>

修正后的实体类:

using System.Collections.Generic;
using System.Xml.Serialization;

[XmlRoot("Root")]
public class RootModel
{
    public RootModel()
    {
        // 初始化集合避免null
        Identities = new List<Identity>();
        Charges = new List<Charge>();
    }

    [XmlElement("Setup")]
    public Setup Setup { get; set; }

    [XmlElement("Transaction")]
    public Transaction Transaction { get; set; }

    [XmlArray("Identities")]
    [XmlArrayItem("Identity")]
    public List<Identity> Identities { get; set; }

    [XmlArray("Charges")]
    [XmlArrayItem("Charge")]
    public List<Charge> Charges { get; set; }
}

public class Setup
{
    [XmlElement("File")]
    public string File { get; set; }

    [XmlElement("SequenceNumber")]
    public int SequenceNumber { get; set; }
}

public class Transaction
{
    [XmlElement("TransactionId")]
    public string TransactionId { get; set; }
}

public class Identity
{
    [XmlElement("UserId")]
    public string UserId { get; set; }

    [XmlElement("UserName")]
    public string UserName { get; set; }
}

public class Charge
{
    [XmlElement("ItemId")]
    public string ItemId { get; set; }

    [XmlElement("Amount")]
    public decimal Amount { get; set; }
}

反序列化验证代码

using System.IO;
using System.Xml.Serialization;
using System.Text.Json;

// 读取XML内容(替换为你的XML字符串或文件路径)
string xmlContent = File.ReadAllText("your_file.xml");

// 反序列化XML到实体类
XmlSerializer serializer = new XmlSerializer(typeof(RootModel));
using StringReader reader = new StringReader(xmlContent);
RootModel model = (RootModel)serializer.Deserialize(reader);

// 序列化为JSON验证结果
string jsonResult = JsonSerializer.Serialize(model, new JsonSerializerOptions { WriteIndented = true });
Console.WriteLine(jsonResult);

内容的提问来源于stack exchange,提问作者miguelito

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 16:10:21