4

いくつかのサブクラスが実装する基本クラスがある状況があります。基本クラスは、システムが必要とする特定のプロパティをサブクラスに含めるように強制するために使用されます。

とにかく、プログラムでサブクラスのXSDを生成したいのですが、基本クラスは内部的な理由で使用され、クライアントにとって実際には意味がないため、基本クラスのプロパティをサブクラスXSDに表示したいと思います。 。

たとえば、現在私が持っている場合:

class Foo {
    public string Id { get; set; }
}

class Bar : Foo {
    public string Name { get; set; }
}

そして、私はそれを次のコードで実行します:

private string ExtractXsdFromType()
{
    Type type = typeof(Bar);
    XmlReflectionImporter importer = new XmlReflectionImporter();
    XmlTypeMapping mapping = importer.ImportTypeMapping(type);
    XmlSchemas xmlSchemas = new XmlSchemas();
    XmlSchemaExporter xmlSchemaExporter = new XmlSchemaExporter(xmlSchemas);
    using (var writer = new StringWriter())
    {
        xmlSchemaExporter.ExportTypeMapping(mapping);
        xmlSchemas[0].Write(writer);
        return XElement.Parse(writer.ToString()).ToString();
    }
}

次に、次のようなXSDを生成します。

<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Bar" nillable="true" type="Bar" />
  <xs:complexType name="Bar">
    <xs:complexContent mixed="false">
      <xs:extension base="Foo">
        <xs:sequence>
          <xs:element minOccurs="0" maxOccurs="1" name="Name" type="xs:string" />
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="Foo" abstract="true">
    <xs:attribute name="Id" type="xs:int" use="required" />
  </xs:complexType>
</xs:schema>

しかし、私は次のようなXSDを作成したいと思います。

<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Bar" nillable="true" type="Bar" />
  <xs:complexType name="Bar">
    <xs:complexContent mixed="false">
      <xs:sequence>
        <xs:attribute name="Id" type="xs:int" use="required" />
        <xs:element minOccurs="0" maxOccurs="1" name="Name" type="xs:string" />
      </xs:sequence>
    </xs:complexContent>
  </xs:complexType>
</xs:schema>

これが可能かどうか誰かが知っていますか?

4

1 に答える 1

1

少なくともほとんどの場合、オブジェクト指向の観点から物事を壊してしまうという理由だけで、あなたが説明した方法でこれが可能であるのを実際に見ると、私は非常に驚きます。たとえば、クラスが型のプロパティを使用する場合、OOでは、その型を拡張するすべてのクラスが代わりに許可されます。

クラス階層(私が正しく理解していればあなたが説明するもの)を折りたたむと、XSDモデルを正しく作成できなくなります。XSDリファクタリングの観点からそうしようとしても、特に抽象型が関与する場合、または置換グループ(私は一般的に話している)には制限があります。

于 2012-08-14T18:12:56.760 に答える