首页 > 代码库 > svcutil 生成代理类时的问题

svcutil 生成代理类时的问题

如果有这个的xsd, group内嵌choice的结构:

<xs:complexType name="CreateType">
        <xs:sequence>
               <xs:group ref="NameChoicesGroup" />
               <xs:element name="Info" type="InfoType" />
        </xs:sequence>
</xs:complexType>

<xs:group name="NameChoicesGroup">
        <xs:choice>
                <xs:element name="NameID" type="IDType"/>
                <xs:element name="Name" type="xs:string"/>
        </xs:choice>
</xs:group>

 

使用svcutil 生成后的结果是:

public class CreateType

{

  int NameID

      string Name

}

因为是choice 类型,这个结果显然不能表示choice的特点,bug?

 

解决问题:

生成前,使用xslt 把所有的group替换成实际的内容, 生成结果:

public class CreateType

{

    [System.Xml.Serialization.XmlElementAttribute("NameID", typeof(uint), Order = 0)]

    [System.Xml.Serialization.XmlElementAttribute("Name", typeof(string), Order = 0)]

 

    [System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemElementName")] 

 

     object Name {...}

}

 

xslt:

<xsl:stylesheetversion="1.0" xmlns:xsl=http://www.w3.org/1999/XSL/Transform" xmlns:xs=http://www.w3.org/2001/XMLSchema>

<xsl:outputmethod="xml"indent="yes"/>

<xsl:keyname="Groups"match="xs:group[@name=‘NameChoicesGroup‘]"use="@name"/>

 <xsl:templatematch="xs:group[@ref=‘NameChoicesGroup‘]">

<xsl:comment> 

Begin

<xsl:value-ofselect="@ref"/>

</xsl:comment><xsl:variablename="Temp"select="key(‘Groups‘, ‘NameChoicesGroup‘)"/>

<xsl:copy-ofselect="$Temp/xs:choice"/>

<xsl:comment> 

 End

<xsl:value-ofselect="@ref"/>

</xsl:comment>

</xsl:template>

<xsl:templatematch="@*|node()">

<xsl:copy>

<xsl:apply-templatesselect="@*|node()" />

</xsl:copy>

</xsl:template>

</xsl:stylesheet>

 

svcutil 生成代理类时的问题