web-dev-qa-db-ja.com

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

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

278

とてもシンプル。ただ実行してください(vsコマンドプロンプトで)

xsd your.xsd /classes

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

オプションについては、xsd /?または を使用してください。MSDN を参照してください。例えば/enableDataBindingは役に立ちます。

445
Marc Gravell

marc Gravellが述べたxsd.exe。 IMOを立ち上げて実行するための最速の方法。

もっと柔軟性やオプションが必要な場合は

xsd2code VSアドイン(Codeplex)

53
Serge Wautier

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

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

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

Xsd2codeのany機能はSystem.Xml.XmlElementとしてデシリアライズします。これは非常に便利ですが、強力な型指定オブジェクトが必要な場合は問題になる可能性があります。私はカスタム設定データを許可するときにanyを使うことが多いので、XmlElementは他の場所でカスタム定義されている別のXMLデシリアライザに渡すのに便利です。

14
VoteCoffee

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%
4
hdoghmen

迅速で怠惰な解決策については、(そして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によるものであることを考慮してください。結果は明らかに改良が必要です。

1
cnom

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

このように KB325695 拡張子を.xmlから.xsdに変更しましたが、うまくいきました。

1
Igoris Azanovas

私の場合はうまくいったコマンドは次のとおりです。

xsd /c your.xsd 
0
Melchia

Windowsのコマンドプロンプトでxsd.exeを使用しました。

しかし、私のxmlはいくつかのオンラインxmlを参照していたので(私の場合はhttp://www.w3.org/1999/xlink.xsdを参照していますhttp://www.w3.org/2001/xml.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

0
Aske B.

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 
0
Hamit YILDIRIM