【问题标题】:Access Elements in XSD to C# Class With xs:Choice使用 xs:Choice 将 XSD 中的元素访问到 C# 类
【发布时间】:2022-09-24 09:40:30
【问题描述】:

我已经阅读了几十篇关于 xs:Choice XSD 元素的文章,但无法理解我们应该如何使用生成的类。这是 XSD 元素和 Xsd2Code++ 的类转换:

<xs:element name=\"VariantRoads\">
    <xs:complexType>
        <xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">
            <xs:element ref=\"Variant\" minOccurs=\"0\"/>
            <xs:element ref=\"DepVariant\"/>
            <xs:element ref=\"ArrVariant\"/>
        </xs:choice>
    </xs:complexType>
</xs:element>


[XmlArrayItemAttribute(\"ArrVariant\", typeof(ArrVariantType), IsNullable = false)]
[XmlArrayItemAttribute(\"DepVariant\", typeof(DepVariantType), IsNullable = false)]
[XmlArrayItemAttribute(\"Variant\", typeof(VariantType), IsNullable = false)]
public object[] VariantRoads
{
    get
    {
        return _variantRoads;
    }
    set
    {
        _variantRoads = value;
    }
}

这样就可以编译了,现在我准备开始填充我的主类。

BaseRoadType brd = new BaseRoadType();
brd.VariantRoads = = new object[3]; // not sure how to initialize
brd.VariantRoads[0] = ??? // how do I assign my property 

我真的不知道应该如何填充 VariantRoads 类,然后再阅读它并确定做出了什么选择。

    标签: class xsd choice


    【解决方案1】:

    public object[] VariantRoads 声明顶部的 XmlArrayItemAttribute 属性为您提供类型提示,这些提示是可接受的数组元素值。

    xs:choice 仅用于对多种可能性中的一种进行建模 - 但在选择定义中还设置了 maxOccurs="unbounded" 属性,它将类型声明转换为对象数组 object[]

    选择定义用简单的英语读作基本上是“(“ArrVariant”,“DepVariant”,“Variant”)元素的零个或多个选择'

    所以这是可以接受的:

    BaseRoadType brd = new BaseRoadType();
    brd.VariantRoads = new object[1] {
      new ArrVariant()
    };
    

    而且这也是:

    brd.VariantRoads = new object[3] {
      new Variant(), new ArrVariant(), new DepVariant(),
    };
    

    还有多个相同类型的实例:

    brd.VariantRoads = new object[2] {
      new ArrVariant(), new ArrVariant(),
    };
    

    因为数组中的每个元素都代表您在可能的 3 中的“选择”,所以maxOccurs="unbounded" 也意味着您可以有多个选择(因此是数组)。

    更进一步,如果选择定义没有maxOccurs="unbounded",则生成的代码可能如下所示:

    [XmlArrayItemAttribute("ArrVariant", typeof(ArrVariantType), IsNullable = false)]
    [XmlArrayItemAttribute("DepVariant", typeof(DepVariantType), IsNullable = false)]
    [XmlArrayItemAttribute("Variant", typeof(VariantType), IsNullable = false)]
    public object VariantRoad { get; set; }
    

    这意味着你只能有一个选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多