2017-12-05 16 views
0

私は約160のXSDを与えられていて、C#クラスを生成できるようにしたいと思います。私はXSDを変更することは許されず、彼らが私に与えたフォーマットに従って多くのスキーマを追加するかもしれません。要素と型を共有する多くのXSD - クラスを生成する方法はありますか? (c#)

各スキーマには、多くのマッチングの種類などで同じ名前のルート要素を宣言します。

文献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

関連する問題