Visual Studio 2010を使用して、xsdファイルから.NET 4.0 c#クラス(エンティティ)を生成するオプションは何ですか?
Visual Studio 2010を使用して、xsdファイルから.NET 4.0 c#クラス(エンティティ)を生成するオプションは何ですか?
回答:
十分に単純です。(vsコマンドプロンプトで)実行するだけです
xsd your.xsd /classes
(これによりが作成されますyour.cs
)。ただし、ここでの組み込みオプションのほとんどは、2.0以降あまり変更されていません。
オプションについては、MSDNを使用xsd /?
または参照してください。たとえば/enableDataBinding
便利です。
xsd schema1.xsd schema2.xsd schema3.xsd /c
ここでは、Vs2017とVs2019を使用する最も簡単な方法を示します。VisualStudioでxsdを開き、提案されたURLのようにサンプルのxmlファイルを生成します。
2.「XMLスキーマエクスプローラー」内で下にスクロールして、ルート/データノードを見つけます。ルート/データノードを右クリックすると、「サンプルXMLの生成」が表示されます。表示されない場合は、データ要素ノードではなく、いずれかのデータ定義ノードにいることを意味します。
xsd.exeは、循環参照がある場合(つまり、型がその型の要素を直接または間接的に所有できる場合)はうまく機能しません。
循環参照が存在する場合は、Xsd2Codeを使用します。Xsd2Codeは循環参照を適切に処理し、VS IDE内で機能します。これは大きな利点です。また、シリアライゼーション/デシリアライゼーションコードの生成など、使用できる多くの機能があります。ただし、シリアル化を生成する場合は、GenerateXMLAttributesをオンにしてください(そうしないと、すべての要素で定義されていない場合、順序付けの例外が発生します)。
どちらも選択機能ではうまく機能しません。あなたが望むタイプの代わりにオブジェクトのリスト/コレクションで終わるでしょう。これは強く型付けされたクラスにシリアライズ/デシリアライズされないため、可能であればxsdでの選択を避けることをお勧めします。ただし、これを気にしない場合は、問題ありません。
xsd2codeのすべての機能はSystem.Xml.XmlElementとして逆シリアル化されますが、これは本当に便利ですが、厳密に型指定されたオブジェクトが必要な場合は問題になる可能性があります。私はカスタム構成データを許可するときにanyを頻繁に使用するため、XmlElementは、他の場所でカスタム定義されている別のXMLデシリアライザーに渡すのに便利です。
迅速で面倒な解決策については、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にすぎないことを考慮に入れてください。結果には明らかに改良が必要です!
私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%
Marc Gravellsの答えは私にとって正しいものでしたが、私のxsdは.xmlの拡張子が付いていました。私がxsdプログラムを使用したとき、それは与えました:
- The table (Amt) cannot be the child table to itself in nested relations.
このKB325695に従って、拡張子を.xmlから.xsdに変更したところ、問題なく動作しました。
xsd.exe
Windowsコマンドプロンプトで使用しました。
ただし、私の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.exe
それは循環参照が好きではないので大きな混乱でしたが、私は結局成功しました。
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