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

处理camt.053.001.04重复XML标签:无需数组/List的序列化方案

解决camt.053.001.04 XML序列化中重复同名标签的问题

核心问题拆解

你遇到的问题本质是XML序列化工具默认对集合类型(数组/List)会生成外层包裹标签,而camt.053的Schema要求直接生成同级的重复标签,不能有嵌套或外层容器。


针对AdrLine这类纯文本重复标签的解决方案

不要用string[],而是定义一个仅包含文本内容的辅助类,配合[XmlElement]和[XmlText]属性实现:

// 父类(比如包含地址的Contact类)
public class Contact
{
    // 用[XmlElement]指定生成的标签名,直接映射到AdrLine列表
    [XmlElement("AdrLine")]
    public List<AdrLine> AddressLines { get; set; } = new List<AdrLine>();
}

// 辅助类:专门承载AdrLine的文本内容
public class AdrLine
{
    // [XmlText]标记该属性作为标签的文本节点,而非子标签
    [XmlText]
    public string Value { get; set; }
}

序列化后会生成符合要求的XML:

<Contact>
  <AdrLine>北京市朝阳区XX路</AdrLine>
  <AdrLine>XX大厦10层</AdrLine>
</Contact>

针对Bal、Ntry这类复杂结构重复标签的解决方案

对于带子属性的重复标签,只需在父类的集合属性上标记[XmlElement](不要用[XmlArray]),直接指定标签名即可:

// 父类(比如银行对账单Statement类)
public class Statement
{
    // 直接生成多个<Ntry>标签,无外层容器
    [XmlElement("Ntry")]
    public List<Ntry> Entries { get; set; } = new List<Ntry>();
    
    // 同理处理Bal标签
    [XmlElement("Bal")]
    public List<Balance> Balances { get; set; } = new List<Balance>();
}

// Ntry的具体结构类
public class Ntry
{
    public decimal Amt { get; set; }
    public string CdtDbtInd { get; set; }
    public string Sts { get; set; }
    // 其他camt.053定义的属性...
}

// Balance的具体结构类
public class Balance
{
    public decimal Amt { get; set; }
    public string CdtDbtInd { get; set; }
    public string Tp { get; set; }
}

偷懒又靠谱的技巧

直接用微软的xsd.exe工具从camt.053的官方XSD文件生成序列化类,自动处理所有标签规则:

  1. 下载camt.053.001.04的XSD文件
  2. 打开命令提示符,执行:
xsd camt.053.001.04.xsd /classes

生成的类会自动配置好所有[XmlElement]属性,完全符合Schema要求,不用手动写代码踩坑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 21:37:08