xsdから.NET 4.0クラスを生成する方法は?


317

Visual Studio 2010を使用して、xsdファイルから.NET 4.0 c#クラス(エンティティ)を生成するオプションは何ですか?


@drzaus過去にこの作業を行っていましたが、追加すると期待したクラスではなくDataSetクラスとして生成されます。既存のアイテムを追加してXSDファイルを選択するだけです。
msmucker0527

回答:


490

十分に単純です。(vsコマンドプロンプトで)実行するだけです

xsd your.xsd /classes

(これによりが作成されますyour.cs)。ただし、ここでの組み込みオプションのほとんどは、2.0以降あまり変更されていません。

オプションについては、MSDNを使用xsd /?または参照してください。たとえば/enableDataBinding便利です。


83
"C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \ xsd.exe" / classes / language:CS your.xsd
GeorgesC

2
再び救助へのグラベル!この答えは100%正しいですが、私の場合、xsd.exeディレクトリパスをPATH環境変数に追加するのが最も簡単であることがわかりました。マイコンピュータ->プロパティ->詳細設定->環境変数->パス-そして "C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \"(もちろんお使いのマシンに固有のウィンドウと.NETバージョンの両方に細心の注意を払ってください)-ハッピーコーディング!
Pimbrouwers

15
いくつかの相互リンクされたスキーマ定義がある場合は、それらすべてに名前を付けます。 xsd schema1.xsd schema2.xsd schema3.xsd /c
mivra 2016年

56

Marc Gravellが言及したxsd.exe。IMOを稼働させる最速の方法。

または、より多くの柔軟性/オプションが必要な場合:

xsd2code VSアドイン(Codeplex)


10
xsd2codeがまったく動作しませんでした。xsd.exeはより堅牢ですが、「循環」グループを持つスキーマと格闘しています。
ジェフ

xsd2codeはビジュアルスタジオ2017で動作し、まさに私が探していたものでした。まずプログラムファイル(x86)ディレクトリで実行してから、vsixインストーラーを使用する必要があります。その後、それは素晴らしい働きをします。それはlistsの代わりにarrays [] []を生成したxsd.exeよりもはるかに優れていました。iには巨大な.xsdがあり、XMLをシリアル化するクラスを作成する必要があります。xsd.exeはシリアル化可能なコード(.netコア2)を生成せず、xsd2codeはうまく機能しました
hanzolo

Visual Studioの2015 E 2017年XSD2CODEの更新版はこちら:marketplace.visualstudio.com/...
Gianpiero

元のxsd2codeはxsd2code ++になりました。コミュニティエディションはVSマーケットプレイスで入手可能
Gerd K

17

ここでは、Vs2017とVs2019を使用する最も簡単な方法を示します。VisualStudioでxsdを開き、提案されたURLのようにサンプルのxmlファイルを生成します。

  1. 以下のようにデザインビューでxsdを開いたら、xml schema explorerをクリックします。 ここに画像の説明を入力してください

2.「XMLスキーマエクスプローラー」内で下にスクロールして、ルート/データノードを見つけます。ルート/データノードを右クリックすると、「サンプルXMLの生成」が表示されます。表示されない場合は、データ要素ノードではなく、いずれかのデータ定義ノードにいることを意味します。

ここに画像の説明を入力してください

  1. 生成されたXMLをクリップボードにコピーします
  2. ソリューションに新しい空のクラスを作成し、クラス定義を削除します。名前空間のみを残す必要があります
  3. マウスポインターがクラス内にフォーカスしている間に、[編集]-> [形式を選択して貼り付け]-> [XMLをクラスとして貼り付け]を選択します。

残念ながら、これがすべてのクラスを生成することは保証されていませんが、COOLトリックです。
John Zabroski、

1
@JohnZabroskiあなたはそれがあなたのためにうまくいかなかったどんなケースもありましたか?これはサンプルxmlに依存します。すべてのクラスとメンバーを含むサンプルxmlを作成できる場合、クラスとメンバーを見逃す必要はありません。
batmaci

私のポイントは、ステップ2の動作が保証されていないことです。しかし、それはクールなトリックです。
John Zabroski、

素晴らしい答え。あなたはいくつかの冷たいビールに値する!
HenryGuillen17

14

xsd.exeは、循環参照がある場合(つまり、型がその型の要素を直接または間接的に所有できる場合)はうまく機能しません。

循環参照が存在する場合は、Xsd2Codeを使用します。Xsd2Codeは循環参照を適切に処理し、VS IDE内で機能します。これは大きな利点です。また、シリアライゼーション/デシリアライゼーションコードの生成など、使用できる多くの機能があります。ただし、シリアル化を生成する場合は、GenerateXMLAttributesをオンにしてください(そうしないと、すべての要素で定義されていない場合、順序付けの例外が発生します)。

どちらも選択機能ではうまく機能しません。あなたが望むタイプの代わりにオブジェクトのリスト/コレクションで終わるでしょう。これは強く型付けされたクラスにシリアライズ/デシリアライズされないため、可能であればxsdでの選択を避けることをお勧めします。ただし、これを気にしない場合は、問題ありません。

xsd2codeのすべての機能はSystem.Xml.XmlElementとして逆シリアル化されますが、これは本当に便利ですが、厳密に型指定されたオブジェクトが必要な場合は問題になる可能性があります。私はカスタム構成データを許可するときにanyを頻繁に使用するため、XmlElementは、他の場所でカスタム定義されている別のXMLデシリアライザーに渡すのに便利です。


私はあなたの答えを見てxsd2codeを追加しました。循環グループ参照を処理するために何か変更する必要がありますか?デフォルトのプロパティでは機能しません
Jyotsna Sonawane '

循環参照を処理するために特別なことをする必要はありませんでした。新しい質問としてxmlを投稿し、ここにリンクを追加した場合、私はそれを見て喜んでいます。
VoteCoffee

10

迅速で面倒な解決策については、VSをまったく使用せずに、次のオンラインコンバーターを試してください。

XSD => XML => C#クラス

XSDの例:

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="orderperson" type="xs:string"/>
      <xs:element name="shipto">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="address" type="xs:string"/>
            <xs:element name="city" type="xs:string"/>
            <xs:element name="country" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="item" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="title" type="xs:string"/>
            <xs:element name="note" type="xs:string" minOccurs="0"/>
            <xs:element name="quantity" type="xs:positiveInteger"/>
            <xs:element name="price" type="xs:decimal"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="orderid" type="xs:string" use="required"/>
  </xs:complexType>
</xs:element>

</xs:schema>

XMLに変換します。

<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid Technologies Online Tools 1.0 (https://www.liquid-technologies.com) -->
<shiporder xsi:noNamespaceSchemaLocation="schema.xsd" orderid="string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <orderperson>string</orderperson>
  <shipto>
    <name>string</name>
    <address>string</address>
    <city>string</city>
    <country>string</country>
  </shipto>
  <item>
    <title>string</title>
    <note>string</note>
    <quantity>3229484693</quantity>
    <price>-6894.465094196054907</price>
  </item>
  <item>
    <title>string</title>
    <note>string</note>
    <quantity>2181272155</quantity>
    <price>-2645.585094196054907</price>
  </item>
  <item>
    <title>string</title>
    <note>string</note>
    <quantity>2485046602</quantity>
    <price>4023.034905803945093</price>
  </item>
  <item>
    <title>string</title>
    <note>string</note>
    <quantity>1342091380</quantity>
    <price>-810.825094196054907</price>
  </item>
</shiporder>

これはこのクラス構造に変換されます:

   /* 
    Licensed under the Apache License, Version 2.0

    http://www.apache.org/licenses/LICENSE-2.0
    */
using System;
using System.Xml.Serialization;
using System.Collections.Generic;
namespace Xml2CSharp
{
    [XmlRoot(ElementName="shipto")]
    public class Shipto {
        [XmlElement(ElementName="name")]
        public string Name { get; set; }
        [XmlElement(ElementName="address")]
        public string Address { get; set; }
        [XmlElement(ElementName="city")]
        public string City { get; set; }
        [XmlElement(ElementName="country")]
        public string Country { get; set; }
    }

    [XmlRoot(ElementName="item")]
    public class Item {
        [XmlElement(ElementName="title")]
        public string Title { get; set; }
        [XmlElement(ElementName="note")]
        public string Note { get; set; }
        [XmlElement(ElementName="quantity")]
        public string Quantity { get; set; }
        [XmlElement(ElementName="price")]
        public string Price { get; set; }
    }

    [XmlRoot(ElementName="shiporder")]
    public class Shiporder {
        [XmlElement(ElementName="orderperson")]
        public string Orderperson { get; set; }
        [XmlElement(ElementName="shipto")]
        public Shipto Shipto { get; set; }
        [XmlElement(ElementName="item")]
        public List<Item> Item { get; set; }
        [XmlAttribute(AttributeName="noNamespaceSchemaLocation", Namespace="http://www.w3.org/2001/XMLSchema-instance")]
        public string NoNamespaceSchemaLocation { get; set; }
        [XmlAttribute(AttributeName="orderid")]
        public string Orderid { get; set; }
        [XmlAttribute(AttributeName="xsi", Namespace="http://www.w3.org/2000/xmlns/")]
        public string Xsi { get; set; }
    }

}

注意!これはGet-You-Startedにすぎないことを考慮に入れてください。結果には明らかに改良が必要です!


どうもありがとうございます。これは、.NETでXMLスキーマとXMLを学習している人のための良い例として使用できます
theeranitp

素晴らしい答え。あなたはいくつかの冷たいビールに値する!
HenryGuillen17

5

XSDはバッチスクリプトで使用して、.xsdファイルとクラスをXML直接生成します。

set XmlFilename=Your__Xml__Here
set WorkingFolder=Your__Xml__Path_Here

set XmlExtension=.xml
set XsdExtension=.xsd

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

set XmlFilePath=%WorkingFolder%%XmlFilename%%XmlExtension%
set XsdFilePath=%WorkingFolder%%XmlFilename%%XsdExtension%

%XSD% %XmlFilePath% /out:%WorkingFolder%
%XSD% %XsdFilePath% /c /out:%WorkingFolder%


1

Marc Gravellsの答えは私にとって正しいものでしたが、私のxsdは.xmlの拡張子が付いていました。私がxsdプログラムを使用したとき、それは与えました:
- The table (Amt) cannot be the child table to itself in nested relations.

このKB325695に従って、拡張子を.xmlから.xsdに変更したところ、問題なく動作しました。


1

xsd.exeWindowsコマンドプロンプトで使用しました。

ただし、私のxmlはいくつかのオンラインxml http://www.w3.org/1999/xlink.xsdを参照しているため(私の場合はを参照http://www.w3.org/2001/xml.xsd)、これらの回路図もダウンロードし、xsdと同じディレクトリに配置して、コマンドでそれらのファイルを一覧表示する必要がありました。

"C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \ xsd.exe" / classes / language:CS your.xsd xlink.xsd xml.xsd


それは、今のところクラスを構築するアマゾン市場のXSDのようなものではありません:-)私は一度それらを使用する必要がありましたが、再びそれらに触れたり、amazons XSDファイルを使用してC#で何かをしたりすることはありません。このような混乱は非現実的です。
Shawty

@shawty私はGIS標準(WFSおよびWMS)を使用していました。これらは、大きな円形の相互参照されたXSDによって定義されています。xsd.exeそれは循環参照が好きではないので大きな混乱でしたが、私は結局成功しました。
Aske B.

ええ、それは私の第二の推測だったでしょう。それらを見ても、アマゾンのものほど悪いところはありません... 身震いを
ショーティー

0

WSDLに加えて、xsdファイルがありました。上記は私の場合にはうまくいきませんでした。それは次のように働きました

wsdl /l:C# /out:D:\FileName.cs D:\NameApi\wsdl_1_1\RESAdapterService.wsdl 
D:\CXTypes.xsd D:\CTypes.xsd 
D:\Preferences.xsd 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.