web-dev-qa-db-ja.com

クラスからXSDスキーマを作成する方法は?

XSDファイルに苦労しています。

クラスからXSDファイルを作成しようとしています:

public enum Levels { Easy, Medium, Hard }
public sealed class Configuration
{
    public string Name { get;set; }
    public Levels Level { get; set; }
    public ConfigurationSpec { get;set;}
}

public abstract class ConfigurationSpec { }
public class ConfigurationSpec1
{
    // ...
}
public class ConfigurationSpec2
{
    // ...
}

Configuration内に抽象クラスがあることに注意してください。その機能を使用すると、XSDを作成できますか?

アイデアは、クラスConfigurationをXSDに渡すことです。

49
Darf Zon

XSD.exeを使用できます(Visual Studioのインストールから利用可能です。)

public sealed class Configuration
{
 public string Name { get; set; }
 public Levels Level { get; set; }
 public ConfigurationSpec Spec { get; set; }
}
 public abstract class ConfigurationSpec { }
 public class ConfigurationSpec1    {   }
public class ConfigurationSpec2 {   }

結果として

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Levels" type="Levels" />
  <xs:simpleType name="Levels">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Easy" />
      <xs:enumeration value="Medium" />
      <xs:enumeration value="Hard" />
    </xs:restriction>
  </xs:simpleType>
  <xs:element name="Configuration" nillable="true" type="Configuration" />
  <xs:complexType name="Configuration">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="1" name="Name" type="xs:string" />
      <xs:element minOccurs="1" maxOccurs="1" name="Level" type="Levels" />
      <xs:element minOccurs="0" maxOccurs="1" name="Spec" type="ConfigurationSpec" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="ConfigurationSpec" abstract="true" />
  <xs:element name="ConfigurationSpec" nillable="true" type="ConfigurationSpec" />
  <xs:element name="ConfigurationSpec1" nillable="true" type="ConfigurationSpec1" />
  <xs:complexType name="ConfigurationSpec1" />
  <xs:element name="ConfigurationSpec2" nillable="true" type="ConfigurationSpec2" />
  <xs:complexType name="ConfigurationSpec2" />
</xs:schema>

必要なのは、アセンブリをコンパイルし、引数としてアセンブリへのパスを使用してXSD.exeを実行することだけです。 XSD.exe /?には、すべての引数のリストもあります。

例:XSD.exe C:\Dev\Project1\Bin\Debug\library.dll

34
Alex

_xsd.exe_をVisual Studioに正常に統合することができますIDEこのように:

_Tools, External Tools_に移動して、 Add ボタン:

2010

enter image description here

2015/2017

enter image description here

タイトル:

クラスからスキーマを作成

コマンド(フレームワークごと):

4.0

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\x64\xsd.exe

4.5.1

C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\x64\xsd.exe

4.6.*

C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.* Tools\x64\xsd.exe

引数:

$(BinDir)$(TargetName).dll /outputdir:$(ItemDir) /type:$(ItemFileName)

出力ウィンドウを使用:

追加のコマンドウィンドウがポップアップするのを防ぎ、出力をクリアするまで出力の記録を保持します。おそらく良い考えです。

引数のプロンプト:

出力のテストまたはトラブルシューティングを行うかどうかを確認します。それ以外の場合は、未チェックのままにします。

クリック OK

使用方法:

  1. プロジェクトをコンパイルします!_XSD.exe_はコンパイルされたコードのみを調べます。
  2. Solution Explorerのクラスをクリックします。
  3. _Tools, Create Schema From Class_をクリックします
  4. クリックしてください Show All Files Solution Explorerのボタン。
  5. クラスと同じフォルダーを見ると、_Schema0.xsd_が表示されます。
  6. _Schema0.xsd_を右クリックして、_Include In Project_を選択します
  7. _Schema0.xsd_の名前を_<the name of the class>.xsd_に変更します
  8. (オプション)このスキーマを使用してxmlエディターでxmlファイルを編集し、すべての属性を使用していない場合は、この新しいxsdを手動で編集する必要があります。これらの属性が実際に必要でない場合は、_use="required"_を_use="optional"_で置き換えて、xmlエディター(警告を作成する)の青い波線を削除できます。
79
toddmo