visual - xsd to class c# online
Problema de tablas anidadas de generaciĆ³n de clase XSD (4)
Sugeriría un cambio de nombre simple de los elementos del esquema, más el uso de la agrupación (que se muestra a continuación) o incluye xsd (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 el nombramiento repetido 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>
Actualmente tengo un problema con la generación de archivos de clase de un xsd con elementos repetitivos. 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 xml por este esquema
<?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 aparece el siguiente error " La misma tabla ''contacto'' no puede ser la tabla secundaria en dos relaciones anidadas. "
El XSD 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.
Entonces 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
Tuve el mismo problema ... si las interpretaciones no son un problema, puede usar XSLT para cambiar el nombre de las tablas "secundarias" que tienen el mismo nombre (es decir, el nombre resultante es la concatenación del nombre de la tabla y su elemento principal):
...
<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> ...
Tal vez pueda usar xsd: import / xsd: include para dividir el xsd en varios archivos, luego use xsd.exe para compilar cada uno. 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: sa hace un par de años, y por alguna razón decidí usar xsdobjgen.exe en lugar de xsd.exe.
¡Buena suerte!
Mira mi solución para este artículo.
La misma tabla ''nombre'' no puede ser la tabla secundaria en dos relaciones anidadas
Sugiero usar ''ref'' en su esquema para referirse a los elementos ''duplicados''.