许多XSD共享元素& types - 任何生成类的方法? (C#)

时间:2017-12-05 00:52:52

标签: c# xml xsd

我已经获得了大约160个XSD并且希望能够生成c#类,我不允许更改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。

1 个答案:

答案 0 :(得分: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
  {
  }
}

但是你怎么做它会变得有点混乱。