从派生类中的XSD覆盖属性的默认值

时间:2016-06-15 07:34:06

标签: c# inheritance xsd

我有一个包含一些类的XSD文件,如下所示:

<?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="NS"/>
  <import namespace="NS" schemaLocation="Reference.xsd"/>
  <element name="Derived" substitutionGroup="lbm:BaseClass" type="lbm:DerivedType"/>
  <complexType name="DerivedType">
    <complexContent>
      <extension base="lbm:BaseClass">
        <sequence>
          ...
        </sequence>
      </extension>
    </complexContent>
  </complexType>
</schema>

NS对应lbm指示的命名空间。

Reference.xsd lbm:BaseClass内,类<element name="BaseClass" type="lbm:BaseClassType"/> <complexType name="BaseClassType"> <complexContent> <sequence> <element default="270020000" name="ObjektTyp" type="lbm:MyEnum"/> </sequence> </complexContent> </complexType> 的定义如下:

Derived

现在我要做的是让BaseClass继承ObjektTyp,但使用ObjektTyp的另一个默认值。我已经尝试通过添加适当的ObjektTyp1 - 标记来覆盖它。但是,当我使用xsd.exe在.NET上自动生成类时,会创建相同类型但名称为<element default="270020191" name="ObjektTyp" type="lbm:MyEnum"/> 的新属性。

有没有什么办法可以在派生类中为基类定义的属性定义另一个默认值?

public List<string> Test(List<string> stringList)
{

}

1 个答案:

答案 0 :(得分:0)

在显示的示例中,DerivedTyped派生自lbm:BaseClass,扩展名为:

<complexType name="DerivedType">
  <complexContent>
    <extension base="lbm:BaseClass">
      <sequence>
        ...
      </sequence>
    </extension>
  </complexContent>
</complexType>

因此,宣言

<element default="270020191" name="ObjektTyp" type="lbm:MyEnum"/>

不会覆盖,而是创建一个名为ObjectTyp的新元素。

将DerivedType的定义更改为限制派生,如下所示:

<complexType name="DerivedType">
  <complexContent>
    <restriction base="lbm:BaseClass">
      <sequence>
        ...
      </sequence>
    </restriction>
  </complexContent>
</complexType>

可以解决问题。请注意,通过限制派生有一些约束,也就是说,您无法完全更改布局,但只能使其更具限制性。据我所知,更改默认值为allowed

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.example.com"
           xmlns:prefix="http://www.example.com"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified">
    <xs:complexType name="test">
        <xs:sequence>
            <xs:element name="foo" type="xs:string" default="foobar" minOccurs="1"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="test-derived">
        <xs:complexContent>
            <xs:restriction base="prefix:test">
                <xs:sequence>
                    <xs:element name="foo" type="xs:string" default="foobar2" minOccurs="1"/>
                </xs:sequence>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>
    <xs:element name="base" type="prefix:test"/>
    <xs:element name="derived" type="prefix:test-derived"/>
</xs:schema>

这被oXygen接受,似乎与Xerces和Saxon一起使用。使用XQuery,我可以看到默认值正确设置为foobar或foobar2,具体取决于使用的元素。