C# XSD类生成嵌套表问题
目前,我在从包含重复元素的xsd生成类文件时遇到问题。我正在使用VS2005 SP1中的自定义工具“MsDatasetGenerator”,它从xsd为c#创建类型化数据集。我试图用这个模式解析xmlC# 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
<?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> ...