C# XSD类生成嵌套表问题

C# XSD类生成嵌套表问题,c#,xml,.net-2.0,xsd,C#,Xml,.net 2.0,Xsd,目前,我在从包含重复元素的xsd生成类文件时遇到问题。我正在使用VS2005 SP1中的自定义工具“MsDatasetGenerator”,它从xsd为c#创建类型化数据集。我试图用这个模式解析xml <?xml version="1.0" encoding=\"utf-8\"?> <xs:schema id="XSDobject" targetNamespace="http://tempuri.org/XSDobject.xsd" elementFormDefault

目前,我在从包含重复元素的xsd生成类文件时遇到问题。我正在使用VS2005 SP1中的自定义工具“MsDatasetGenerator”,它从xsd为c#创建类型化数据集。我试图用这个模式解析xml

    <?xml version="1.0" encoding=\"utf-8\"?>
<xs:schema id="XSDobject" targetNamespace="http://tempuri.org/XSDobject.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XSDobject.xsd" xmlns:mstns="http://tempuri.org/XSDobject.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="order">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="contact">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="name" type="xs:string" />
                            <xs:element name="phone" type="xs:string" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="buyer">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="contact">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="name" type="xs:string" />
                                        <xs:element name="phone" type="xs:string" />
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

但我得到以下错误“同一个表“contact”不能是两个嵌套关系中的子表。

XSD编译正确,但类型化数据集不能处理重复表。现在我也测试了xsd.exe工具,但它似乎生成了与msdatasetgenerator相同的代码。我还尝试了一些第三方代码生成器工具,如XSD2Code、CodeXS、AltovaXmlSpy,但我也无法让它与嵌套元素一起工作

或者,我可以在输入和输出端使用xslt转换来解决这个问题,但这会让我损失很多性能

所以现在我问是否有人能帮我找到一个VS2005的好解决方案,或者知道一个好的xsd类生成器可以处理这个问题。它不必是类型化的数据集,如果它作为数组或列表工作,它也是完美的,只要它易于序列化和反序列化

提前谢谢
Freggel

我建议对模式项进行简单的重命名,再加上使用分组(如下所示)或xsd包含(如果其他模式需要这种复杂类型)。如果你对名字没有硬性要求,这个问题就可以解决了

根据经验,我认为may工具无法在您的示例中重复命名

像这样的事情可能会奏效:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="XSDobject" targetNamespace="http://tempuri.org/XSDobject.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XSDobject.xsd" xmlns:mstns="http://tempuri.org/XSDobject.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:group name="Contact">
    <xs:sequence>
      <xs:element name="name" type="xs:string" />
      <xs:element name="phone" type="xs:string" />
    </xs:sequence>
  </xs:group>
  <xs:element name="order">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="OrderContact">
          <xs:complexType>
            <xs:sequence>
              <xs:group ref="Contact"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="buyer">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="BuyerContact">
                <xs:complexType>
                  <xs:sequence>
                    <xs:group ref="Contact"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

我也有同样的问题。。如果性能不是问题,则可以使用XSLT重命名具有相同名称的“子”表(即结果名称是表名及其父表的串联):

。。。
...

也许您可以使用xsd:import/xsd:include将xsd拆分为几个文件,然后使用xsd.exe编译每个文件。我认为在使用xsd.exe时,可以指定要生成代码的命名空间

几年前,我曾使用xsd:s生成类,出于某种原因,我决定使用xsdobjgen.exe而不是xsd.exe


祝你好运

看看我的解决方案

我建议在模式中使用'ref'来引用'replicate'元素

 ...
  <xsl:template match="*">
     <xsl:param name="parentElm">
       <xsl:value-of select="name(..)" />
     </xsl:param>
     <xsl:choose>
       <xsl:when test="local-name() = 'Contact'">
         <xsl:element name="{concat('Contact',$parentElm)}">
           <xsl:apply-templates select="@* | node()" />
         </xsl:element>
       </xsl:when> <xsl:otherwise>
         <xsl:element name="{local-name()}">
           <xsl:copy-of select="@*" />
           <xsl:apply-templates select="@* | node()" />
         </xsl:element>
       </xsl:otherwise>
     </xsl:choose>   </xsl:template> ...