2017-12-05 10 views
0

나는 약 160 개의 XSD를 받았고 C# 클래스를 생성 할 수 있기를 바란다. XSD를 변경할 수 없으며, 그들이 나에게 준 형식을 따르는 더 많은 스키마를 추가 할 수있다.요소 및 유형을 공유하는 많은 XSD - 클래스를 생성하는 방법은 무엇입니까?

각 스키마가 많은 일치하는 유형과 동일한 이름의 루트 요소를 선언는 예 :

문헌 1 :

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:element name="Root-XML" type="Root-XMLType1"/> 
    <xs:complexType name="Root-XMLType1"> 
    <xs:sequence> 
    <xs:element name="Header" type="HeaderStruct"/> 
    <xs:element name="Delivery" type="DeliveryType1Struct"/> 
    </xs:sequence> 
</xs:complexType> 
<xs:complexType name="DeliveryType1Struct"> 
    <xs:complexContent> 
    <xs:restriction base="DeliveryType1Abstract"> 
    <xs:all> 
     <xs:element name="GMTOffset" type="GMTOffsetType"/> 
     <xs:element name="UserName" type="UserNameType"/> 
    </xs:all> 
    </xs:restriction> 
    </xs:complexContent> 
</xs:complexType> 
..... 9000 more lines of types ..... 
</xs:schema> 

문서 2 :

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:element name="Root-XML" type="Root-XMLType2"/> 
    <xs:complexType name="Root-XMLType2"> 
    <xs:sequence> 
    <xs:element name="Header" type="HeaderStruct"/> 
    <xs:element name="Delivery" type="DeliveryType2Struct"/> 
    </xs:sequence> 
</xs:complexType> 
<xs:complexType name="DeliveryType2Struct"> 
    <xs:complexContent> 
    <xs:restriction base="DeliveryType2Abstract"> 
    <xs:all> 
     <xs:element name="GMTOffset" type="GMTOffsetType"/> 
     <xs:element name="UserName" type="UserNameType"/> 
    </xs:all> 
    </xs:restriction> 
    </xs:complexContent> 
</xs:complexType> 
..... 9000 more lines of types ..... 
</xs:schema> 

이러한 스키마의 대부분 있습니다 여기 저기에 몇 가지 추가 된 요소를 제외하고는 동일합니다.

XSD.exe를 사용하려고했지만 '이 유형이 이미 선언되었습니다'라는 경고와 많은 누락 된 요소가있었습니다. 그것이 매개 변수 파일에서 전달 된 마지막 XSD를 선택한 것처럼 보였습니다.

+0

이름 충돌이 발생하고 네임 스페이스를 사용하지 않는 경우 여기에서 어떤 종류의 대답을 기대합니까? 논리적으로, 다른 이름으로 같은 이름을 사용하는 것은 본질적인 문제를 제시합니다. 먼저 수정하십시오. – kjhughes

+0

나는 엄격한 지침에 따라 스키마를 변경하지 않습니다. 다른 네임 스페이스를 사용했거나 스키마를 만든 경우 스키마를 병합했습니다. – nelsontruran

+0

XmlDocument 클래스 또는 XDocument 클래스를 사용하여 클래스를 구문 분석 할 수 있습니다. 스키마는 유효한 XML을 생성하고 있는지 확인하는 데 사용되며 유효한 XML을 읽는 데 필요하지 않습니다. – jdweng

답변

1

xsd.exe를 사용하여 각 스키마에 대한 클래스 집합을 생성하고 각각을 고유 한 .net 네임 스페이스로 이동할 수 있습니다.

xsd.exe가 부분 클래스를 생성 한 경우 공통성을 가진 인터페이스에 인터페이스를 추가하여 각 스키마에 대한 코드를 작성하는 것처럼 다형성으로 작업 할 수 있습니다.

// Generated by XSD.exe 
namespace A 
{ 
    partial class GeneratedRootXML 
    { 
     public string Header {get;set;} 
     .... 
    } 
} 

// Generated by XSD.exe 
namespace B 
{ 
    partial class GeneratedRootXML 
    { 
     public string Header {get;set;} 
     .... 
    } 
} 

// Your code 
interface IMyRootXML 
{ 
    public string Header {get;set;} 
} 

namespace A 
{ 
    partial class GeneratedRootXML : IMyRootXML 
    { 
    } 
} 

namespace B 
{ 
    partial class GeneratedRootXML : IMyRootXML 
    { 
    } 
} 

하지만 어떻게하면 혼란 스러울 수 있습니다.

+0

나는 더 깨끗한 방법을 원했지만 잘 작동했다. – nelsontruran