2008-12-29 21 views
5

Actualmente estoy teniendo un problema con la generación de archivos de clase de un xsd con elementos que se repiten. Estoy usando la herramienta personalizada 'MsDatasetGenerator' en VS2005 SP1 que crea un conjunto de datos tipeados de xsd para C#. Estoy tratando de analizar el código XML mediante este esquemaXSD generación de clases tablas anidadas problema

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

pero me da error “La misma tabla de 'contacto' que sigue no puede ser la tabla secundaria en dos relaciones anidadas. "

El XSD se compila correctamente pero es el conjunto de datos tipeados que no puede manejar tablas repetitivas. Ahora también he probado la herramienta xsd.exe pero parece generar el mismo código que el msdatasetgenerator. También probé algunas herramientas de generación de código de terceros como XSD2Code, CodeXS, AltovaXmlSpy pero tampoco puedo hacer que funcione con elementos anidados.

Alternativamente podría resolver el problema con la transformación xslt en la entrada y la salida pero me costaría mucho rendimiento.

Así que ahora estoy preguntando si alguien podría ayudarme con una buena solución para VS2005, o conozco un buen generador de clases xsd que pueda manejar este problema. No tiene que ser un conjunto de datos tipeados si funciona como una matriz o una lista, también es perfecto, siempre que sea fácil serializarlo y deserializarlo.

Gracias de antemano Freggel

Respuesta

1

sugeriría un cambio de nombre simple de los elementos de esquema, más el uso de agrupación (que se muestra a continuación) o xsd incluye (si necesita este tipo complejo para otros esquemas). Esto debería resolver el problema si no tienes requisitos estrictos en los nombres.

Por experiencia, no creo que las herramientas funcionen con los nombres repetidos en su ejemplo.

Algo como esto puede hacer el truco:

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

que tenía el mismo problema .. si las actuaciones no son un problema, puede utilizar XSLT para cambiar el nombre de las tablas "niños" que tienen el mismo nombre, (es decir, el nombre resultante es la concatenación de nombre de la tabla y su padre):

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

Tal vez se puede utilizar el xsd: import/xsd: include para dividir el xsd en varios archivos, a continuación, utilizar xsd.exe para compilar cada. Creo que puede especificar el espacio de nombres para generar el código cuando se trabaja con xsd.exe.

Trabajé con la generación de clases de xsd: s hace un par de años, y por alguna razón decidí usar xsdobjgen.exe en lugar de xsd.exe.

¡Buena suerte!