如何让xsd.exe生成代码时包含ISO 20022外部代码集的枚举值?
我手里有ISO 20022标准的camt.026消息XSD文件,还有对应复杂类型InvestigationStatus5Choice的Conf元素能用的外部代码集XSD文件。camt.026的XSD里只给ExternalInvestigationExecutionConfirmation1Code简单类型加了字符串长度限制,而外部代码集的XSD里这个类型有具体的枚举值。
用xsd.exe生成代码时,不管怎么调整两个XSD的输入顺序,生成的代码都只认camt.026的XSD定义,Conf属性被生成为string类型,完全没带上外部代码集的枚举值。我试过的命令示例:
xsd.exe /classes ..\..\..\2Q2023_ExternalCodeSets_v1.xsd .\iso\camt.029.001.09.xsd xsd.exe /classes iso\camt.029.001.09.xsd .\..\..\..\2Q2023_ExternalCodeSets_v1.xsd
先核对命名空间是否一致
确认外部代码集XSD里ExternalInvestigationExecutionConfirmation1Code类型的命名空间,和camt.026的XSD中该类型的命名空间完全匹配。如果两者命名空间不一样,xsd.exe会把它们当成两个独立类型,优先用主XSD的定义。修改camt.026的XSD,引用外部代码集的类型
打开camt.026的XSD文件,找到ExternalInvestigationExecutionConfirmation1Code的定义部分,换成对外部代码集XSD的引用:- 如果两者命名空间相同,用
<xsd:redefine>导入外部XSD,这样主XSD会直接复用外部的枚举定义,不再用自己的简单字符串限制:<xsd:redefine schemaLocation="相对或绝对路径/2Q2023_ExternalCodeSets_v1.xsd"> <!-- 要是需要保留主XSD的额外限制,可以在这里扩展,一般直接复用就行 --> </xsd:redefine> - 如果命名空间不同,先用
<xsd:import>导入外部命名空间,然后在主XSD里明确指定使用外部命名空间的ExternalInvestigationExecutionConfirmation1Code类型,替换原来的本地定义。
- 如果两者命名空间相同,用
试试加/imports参数
在命令里加上/imports参数,强制xsd.exe处理导入的类型定义:xsd.exe /classes /imports ..\..\..\2Q2023_ExternalCodeSets_v1.xsd .\iso\camt.029.001.09.xsd临时方案:合并XSD内容
要是上面的方法都不管用,可以手动把外部代码集XSD里ExternalInvestigationExecutionConfirmation1Code的枚举定义复制到camt.026的XSD里,替换掉原来的简单类型定义,再用xsd.exe生成代码。
内容的提问来源于stack exchange,提问作者Jimenemex

