处理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文件生成序列化类,自动处理所有标签规则:
- 下载camt.053.001.04的XSD文件
- 打开命令提示符,执行:
xsd camt.053.001.04.xsd /classes
生成的类会自动配置好所有[XmlElement]属性,完全符合Schema要求,不用手动写代码踩坑。
内容的提问来源于stack exchange,提问作者ivorysmoker
相关产品推荐
相关产品推荐

