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 \"추가 (물론 컴퓨터와 관련된 Windows 및 .NET 버전에 세심한주의를 기울이십시오)-행복한 코딩!
pimbrouwers

15
여러 개의 상호 연결된 스키마 정의가있는 경우 모두 이름을 지정하십시오. xsd schema1.xsd schema2.xsd schema3.xsd /c
mivra

56

Marc Gravell이 언급 한 xsd.exe IMO를 시작하고 실행하는 가장 빠른 방법입니다.

또는 더 많은 유연성 / 옵션이 필요한 경우 :

xsd2code VS 애드 인 (Codeplex)


10
xsd2code를 전혀 사용할 수 없었습니다. xsd.exe는보다 강력하지만 "원형"그룹이있는 스키마에서는 어려움을 겪습니다.
Jeff

xsd2code는 Visual Studio 2017에서 작동하며 정확히 내가 찾던 것입니다. 프로그램 파일 (x86) 디렉토리에서 먼저 실행 한 다음 vsix 설치 프로그램을 사용해야합니다. 그럼 잘 작동합니다. 그것은 list.i 대신 arrays [] []를 생성 한 xsd.exe에 대해 극도로 우수했습니다. 나는 거대한 .xsd를 가지고 있으며 XML을 직렬화하기 위해 클래스를 만들어야합니다. xsd.exe는 직렬화 코드 (.NET의 핵심 2)를 생성하지 않을 및 xsd2code 큰 일
hanzolo을

Visual Studio 2015 e 2017 용 XSD2CODE의 업데이트 된 버전은 다음과 같습니다. marketplace.visualstudio.com/…
Gianpiero

원래 xsd2code는 이제 xsd2code ++입니다. 커뮤니티 에디션은 VS Marketplace
Gerd K

17

Vs2017 및 Vs2019를 사용하는 가장 쉬운 방법을 보여줍니다. Visual Studio에서 xsd를 열고 제안 된 URL 과 같이 샘플 xml 파일을 생성하십시오 .

  1. 아래와 같이 디자인 뷰에서 xsd를 열면 XML 스키마 탐색기를 클릭하십시오. 여기에 이미지 설명을 입력하십시오

2. "XML Schema Explorer"에서 루트 / 데이터 노드를 찾기 위해 맨 아래로 스크롤하십시오. 루트 / 데이터 노드를 마우스 오른쪽 버튼으로 클릭하면 "Generate Sample XML"이 표시됩니다. 표시되지 않으면 데이터 요소 노드에 없지만 데이터 정의 노드에 있음을 의미합니다.

여기에 이미지 설명을 입력하십시오

  1. 생성 된 Xml을 클립 보드에 복사
  2. 솔루션에서 빈 클래스를 새로 작성하고 클래스 정의를 삭제하십시오. 네임 스페이스 만 남아 있어야합니다.
  3. 마우스 포인터가 클래스 내부에 초점을 둔 상태에서 편집 -> 붙여 넣기 특수-> Xml을 클래스로 붙여 넣기를 선택하십시오.

불행히도 모든 클래스를 생성한다고 보장 할 수는 없지만 COOL 트릭입니다.
John Zabroski

1
@JohnZabroski 당신은 그것이 당신을 위해 작동하지 않은 경우가 있었습니까? 샘플 xml에 따라 다르며 모든 클래스와 멤버로 샘플 xml을 만들 수 있다면 클래스와 멤버를 놓칠 이유가 없습니다.
batmaci

내 요점은 2 단계가 작동한다고 보장하지는 않습니다. 그러나 그것은 멋진 속임수입니다.
존 자브로 스키

훌륭한 답변입니다. 차가운 맥주를 마셔야합니다!
HenryGuillen17

14

순환 참조가있는 경우 xsd.exe가 제대로 작동하지 않습니다 (예 : 유형은 자체 유형의 요소를 직접 또는 간접적으로 소유 할 수 있음).

순환 참조가 존재하면 Xsd2Code를 사용합니다. Xsd2Code는 순환 참조를 잘 처리하고 VS IDE 내에서 작동합니다. 또한 직렬화 / 직렬화 코드 생성과 같이 사용할 수있는 많은 기능이 있습니다. 직렬화를 생성하는 경우 GenerateXMLAttributes를 설정해야합니다. 그렇지 않으면 모든 요소에 정의되지 않은 경우 순서에 대한 예외가 발생합니다.

둘 다 선택 기능과 잘 작동하지 않습니다. 원하는 유형 대신 객체 목록 / 컬렉션으로 끝납니다. 가능한 경우 xsd에서 선택하지 않는 것이 좋습니다. 강력한 유형의 클래스로 직렬화 / 직렬화 해제하지 않기 때문입니다. 그래도 신경 쓰지 않아도 문제가되지 않습니다.

xsd2code의 모든 기능은 System.Xml.XmlElement로 역 직렬화됩니다.이 기능은 매우 편리하지만 강력한 유형의 객체를 원할 경우 문제가 될 수 있습니다. 사용자 정의 구성 데이터를 허용 할 때 종종 any를 사용하므로 XmlElement는 다른 곳에서 사용자 정의 된 다른 XML deserializer에 전달하는 것이 편리합니다.


귀하의 답변을보고 xsd2code를 추가했습니다. 순환 그룹 참조를 처리하기 위해 무엇을 변경해야합니까? 기본 속성으로는 작동하지 않습니다.
Jyotsna Sonawane

순환 참조로 작업하기 위해 특별한 작업을 수행 할 필요가 없었습니다. xml을 새로운 질문으로 게시하고 여기에 링크를 추가하면 기꺼이 살펴 보겠습니다.
VoteCoffee

10

빠르고 게으른 솔루션을 얻으 려면 (VS를 전혀 사용하지 않음) 다음 온라인 변환기를 사용해보십시오.

  • XSD - 투 - XML 컨버터 여기
  • 여기 xmltocsharp 변환기

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; }
    }

}

주의! 이것이 시작하기위한 것임을 명심하십시오. 결과에는 분명히 개선이 필요합니다!


정말 고맙습니다. 이것은 .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%

2

내 경우에 효과가 있었던 명령은 다음과 같습니다.

xsd /c your.xsd 

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의 존재가되지 않을 것입니다. 현재 클래스를 구축하는 것이 좋을 것입니다 :-) 나는 그들과 함께 한 번 작업해야했지만 결코 다시는 감동하지 않거나 아마존 XSD 파일을 사용하여 C #에서 어떤 작업도 수행하지 않을 것입니다. 그런 혼란은 비현실적입니다.
shawty

@shawty 저는 ​​대형 원형 상호 참조 XSD로 정의 된 GIS 표준 (WFS 및 WMS)을 사용했습니다. xsd.exe순환 참조를 좋아하지 않기 때문에 큰 혼란 이었지만 결국 성공했습니다.
Aske B.

그렇습니다, 그것은 나의 두번째 추측 일 것입니다. 이것도 보았지만, 아마존의 물건만큼 나쁜 곳은 없습니다. 저를 기억하는 악몽을 냅니다
shawty

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.