为 xml 模式中的简单类型生成正确的对象

问题描述 投票:0回答:1

我有

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

c# xml xsd xsd.exe
1个回答
0
投票

我很确定这是正常的一代。

这里的选择是在字段声明(这里

xs:string
minLength = 1
maxLength = 4
)和某个时间的实际可能值(在外部代码中声明)之间进行分割

外部化代码集的目的和价值是允许更频繁地更新代码集,例如在代码集中添加新代码,而不影响消息的版本和消息的开发周期。实际上,外部代码集遵循季度更新周期。

如果服务添加了新的枚举值,您的基本代码将无法检索您将在接收器部分的 XML 中获得的值,并且可能会导致错误(或在接收器部分中检索空/空值)最好的情况)。

通过像这样拆分代码,您仍然可以从外部引用生成枚举,并根据收到的

string

 值进行一些比较,但您将收到的值的未来证明演化(未知值不会被处理)您这边无需进行任何更改,并且反序列化数据不会失败)。

© www.soinside.com 2019 - 2024. All rights reserved.