Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
许多XSD共享元素&;类型-有没有生成类的方法?(c#)_C#_Xml_Xsd - Fatal编程技术网

许多XSD共享元素&;类型-有没有生成类的方法?(c#)

许多XSD共享元素&;类型-有没有生成类的方法?(c#),c#,xml,xsd,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

我得到了大约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>

..... 9000多行类型。。。。。
文件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>

..... 9000多行类型。。。。。
除了在这里和那里添加了一些元素外,这些模式中的大多数都是相同的


我尝试使用XSD.exe,但出现了“此类型已声明”警告和许多缺少的元素;它似乎只是选择了在参数文件中传递给它的最后一个XSD。

您可以使用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
  {
  }
}

但是无论你怎么做,都会有点混乱。

如果你有名称冲突,并且不使用名称空间,你希望得到什么样的答案?从逻辑上讲,以不同的方式使用相同的名称会带来一个固有的问题。首先解决这个问题。我受到严格的指示,不能更改模式。如果我创建了模式,我可能会使用不同的名称空间或将其展平。您可能希望仅使用XmlDocument类或XDocument类解析类。模式用于检查是否生成了有效的xml,而不需要读取有效的xml。对不起,但我认为这是一种不好的方法。当您处理一个小的、简单的、稳定的模式时,数据绑定是一种很好的XML处理方法。当您处理大量不断变化的复杂模式时,它不会扩展。我想用一种更干净的方法来实现它,但效果很好。