我有
camt.026 ISO 消息的 ISO 20022 标准
.xsd
文件以及它可以根据复杂类型 conf
上的 InvestigationStatus5Choice
元素使用的可能的 外部代码。
camt.026 xsd:
<xs:complexType name="InvestigationStatus5Choice">
<xs:choice>
<xs:element name="Conf" type="ExternalInvestigationExecutionConfirmation1Code"/>
...
</xs:choice>
</xs:complexType>
同一个 camt.026 xsd 文件也将这个
ExternalInvestigationExecutionConfirmation1Code
类型声明为
<xs:simpleType name="ExternalInvestigationExecutionConfirmation1Code">
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="4"/>
</xs:restriction>
</xs:simpleType>
外部代码集 xsd 应该具有此
ExternalInvestigationExecutionConfirmation1Code
类型的类型声明以及可能的枚举值。
<xs:simpleType name="ExternalInvestigationExecutionConfirmation1Code">
...
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="4"/>
<xs:enumeration value="ACDA">
...
</xs:enumeration>
<xs:enumeration value="ACNR">
...
</xs:enumeration>
<xs:enumeration value="ACVA">
...
...
...
似乎每次我使用
xsd.exe
生成代码时,它都会基于 camt.026 xsd 中找到的简单类型生成,并且不包括外部代码集 xsd 中找到的可能枚举值。
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.8.3928.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:iso:std:iso:20022:tech:xsd:camt.029.001.09")]
public partial class InvestigationStatus5Choice {
private object[] itemsField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("AssgnmtCxlConf", typeof(bool))]
[System.Xml.Serialization.XmlElementAttribute("Conf", typeof(string))] // <-- This should be of type ExternalInvestigationExecutionConfirmation1Code
[System.Xml.Serialization.XmlElementAttribute("DplctOf", typeof(Case5))]
[System.Xml.Serialization.XmlElementAttribute("RjctdMod", typeof(ModificationStatusReason1Choice))]
public object[] Items {
get {
return this.itemsField;
}
set {
this.itemsField = value;
}
}
}
如何使其包含枚举值?我尝试将外部代码集 xsd 放在 camt.026 xsd 之前和之后,因为我认为顺序很重要,但没有运气。
我的文件夹结构在这里是独特的,但文件是可解析的,我正在尝试:
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
我很确定这是正常的一代。
这里的选择是在字段声明(这里
xs:string
与minLength = 1
和maxLength = 4
)和某个时间的实际可能值(在外部代码中声明)之间进行分割
如果服务添加了新的枚举值,您的基本代码将无法检索您将在接收器部分的 XML 中获得的值,并且可能会导致错误(或在接收器部分中检索空/空值)最好的情况)。外部化代码集的目的和价值是允许更频繁地更新代码集,例如在代码集中添加新代码,而不影响消息的版本和消息的开发周期。实际上,外部代码集遵循季度更新周期。
通过像这样拆分代码,您仍然可以从外部引用生成枚举,并根据收到的
string
值进行一些比较,但您将收到的值的未来证明演化(未知值不会被处理)您这边无需进行任何更改,并且反序列化数据不会失败)。