C#如何将两个不同XSD文件中的多个相同类合并为单个类
ISO 20022 camt.053/camt.054 同命名空间复用类型方案
完全可以实现同命名空间下的类型复用,核心逻辑是抽离两个XSD的公共定义做共享依赖,避免重复生成类,具体操作如下:
操作步骤
- 抽离公共类型定义
对比camt.053、camt.054的原始XSD文件,将220个结构、约束、命名完全一致的简单/复杂类型全部提取出来,单独存为公共schema文件(比如命名为camt-shared.xsd),给该公共schema设置你项目需要的统一目标命名空间即可,提取过程不要修改类型的字段顺序、数据约束、命名,保证和原始ISO定义完全一致。 - 改造两个消息的专属XSD
删除camt.053.xsd、camt.054.xsd中已经抽离到公共schema的重复类型定义,仅保留两个消息各自独有的类型(比如各自的根节点结构、差异化字段对应的专属类型);在两个专属XSD的头部添加对公共schema的import引用,同时将两个专属XSD的目标命名空间设置为和公共schema完全一致的统一命名空间。
注意两个消息的根节点通常都命名为Document,可以在改造时直接给根节点类型加消息类型后缀做区分,比如camt.053的根类型命名为Document053、camt.054的根类型命名为Document054,避免同命名空间下的根类型重名冲突。 - 统一生成实体类代码
不要分开单独编译两个消息的XSD,将公共schema、改造后的两个消息专属schema放在同一编译队列中,使用你项目对应的XML代码生成工具(xsd.exe、xjc、XmlSchemaClassGenerator等),指定目标XML命名空间映射到项目中同一个代码命名空间,工具会自动识别公共类型仅生成一次实体类,两个消息的专属类型单独生成,所有公共类型直接复用,不会产生冗余代码。
注意事项
- 两个消息中约20个非完全一致的类型,哪怕命名相同也不要抽到公共schema中,留在各自的专属XSD定义里,同样加消息后缀做类名区分,避免同命名空间下的类型冲突。
- 序列化、反序列化操作时,只需要在初始化序列化器时指定对应的消息根类型即可,针对公共字段的处理逻辑可以完全通用,不需要为两类消息分别写重复的处理代码。
- 不要直接修改原始XSD的命名空间而不抽离公共类型,否则代码生成阶段会报同命名空间下类型重复定义的错误。
内容的提问来源于stack exchange,提问作者SuffPanda
相关产品推荐
相关产品推荐

