2008-12-29 69 views
5

目前我遇到了从重复元素的xsd生成类文件的问题。我在VS2005 SP1中使用自定义工具'MsDatasetGenerator',从cs的xsd创建一个类型化的数据集。我想通过这个模式XSD类生成嵌套表问题

<?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> 

解析XML,但我得到以下错误“同桌‘接触’不能是子表在两个嵌套关系。

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

另外我可以解决xslt转换在输入和输出的问题,但它会花费我很多的性能。

所以现在我问是否有人可以帮助我一个很好的VS2005解决方案,或知道可以解决这个问题的好的xsd类生成器。如果它作为一个数组或列表工作,它不一定是一个类型化数据集,只要序列化和反序列化它都很容易。

在此先感谢 Freggel

回答

1

我建议架构项目的一个简单的更名,加上分组的使用(如下图所示),或XSD包括(如果你需要其他模式这个复杂的类型)。如果你对名字没有强硬的要求,这应该解决问题。

从经验,我不认为可能工具将与你的例子中的重复命名工作。

像这样的事情可以做的伎俩:

<?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> 
2

我有同样的问题。如果性能是不是一个问题,你可以使用XSLT重命名具有相同名称“子”表, (即所产生的名字是表名和其父的串联):

... 
    <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> ... 
0

也许你可以使用XSD:进口/ XSD:包括到xsd分割成几个文件,然后使用XSD.EXE编译每。我认为你可以在使用xsd.exe时指定命名空间来生成代码。

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

祝你好运!