Foros del Web » Programación para mayores de 30 ;) » .NET »

Crear XML a partir de XSD

Estas en el tema de Crear XML a partir de XSD en el foro de .NET en Foros del Web. Hola a tod@s, estoy desesperandome por momentos... os cuento... Me han dado un schema a partir del cual tengo que crear un xml con datos ...
  #1 (permalink)  
Antiguo 21/09/2007, 03:14
Avatar de Expinete  
Fecha de Ingreso: abril-2006
Ubicación: Zaragoza
Mensajes: 236
Antigüedad: 18 años, 1 mes
Puntos: 3
Crear XML a partir de XSD

Hola a tod@s, estoy desesperandome por momentos...
os cuento...
Me han dado un schema a partir del cual tengo que crear un xml con datos obtenidos de una base de datos para luego subirlo a una página web, donde lo validan con el esquema que me han dado.

Realicé la siguiente operación:
Me cree un dataset en el que cargaba la estructura del schema y fui rellenando las tablas.
Después pasé el dataset a xml.
Pero al subir el #~@# archivo dice que no corresponde con el schema.

Entonces, decidi crearme un dataset tipado con el schema y a partir de ese dataset rellenar las tablas.
Y me da el siguiente error simplemente al hacer el new dataset

"La misma tabla no puede ser la tabla secundaria en dos relaciones anidadas"

Sólo sé que hay dos campos de una tabla que apuntan a la misma tabla.

La verdad ya no se que hacer, alguien se le ocurre alguna idea?

Gracias por la ayuda
  #2 (permalink)  
Antiguo 22/09/2007, 15:13
 
Fecha de Ingreso: septiembre-2007
Mensajes: 52
Antigüedad: 16 años, 7 meses
Puntos: 2
Re: Crear XML a partir de XSD

Cita:
Iniciado por Expinete Ver Mensaje
Realicé la siguiente operación:
Me cree un dataset en el que cargaba la estructura del schema y fui rellenando las tablas.
Después pasé el dataset a xml.
Pero al subir el #~@# archivo dice que no corresponde con el schema.

(..)

La verdad ya no se que hacer, alguien se le ocurre alguna idea?
La conversión a XML es el corazón del problema y quizás un ajuste simple sea todo lo que se necesita, pero es un poco difícil darte alguna sugerencia sin tener más detalles de la situación.

¿El mensaje que recibes al validar el XML te dice qué elemento(s) exactamente no corresponden al esquema? Asimismo, ¿qué código estás usando exactamente para crear el XML?

Además del código, y si no son muy extensos, sería muy útil que publicaras el XSD completo, junto con alguno de los XML que produces para estudiar un poco mejor el problema.
  #3 (permalink)  
Antiguo 24/09/2007, 00:33
Avatar de Expinete  
Fecha de Ingreso: abril-2006
Ubicación: Zaragoza
Mensajes: 236
Antigüedad: 18 años, 1 mes
Puntos: 3
Re: Crear XML a partir de XSD

Gracias por responder aqui teneis el esquema:
Código PHP:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns="http://www.fundaciontripartita.es/schemas" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.fundaciontripartita.es/schemas" elementFormDefault="qualified">
  <!-- TIPOS SIMPLES -->
  
  <xs:simpleType name="t_pais">
    <xs:restriction base="xs:string">
      <xs:maxLength value="20" />
      <xs:whiteSpace value="collapse" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="t_idAccion">
    <xs:restriction base="xs:string">
      <xs:pattern value="[0-9]{1,5}" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="t_nif">
    <xs:restriction base="xs:string">
      <xs:whiteSpace value="collapse" />
      <xs:length value="9" />
      <xs:pattern value="([Xx]|[0-9])[0-9]{7}([a-z]|[A-Z])" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="t_cif">
    <xs:restriction base="xs:string">
      <xs:whiteSpace value="collapse" />
      <xs:length value="9" />
      <xs:pattern value="[AaBbCcDdEeFfGgHhKkLlMmNnPpQqSs][0-9]{7}[AaBbCcDdEeFfGgHhIiJj0123456789]" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="t_cif_nif">
    <xs:restriction base="xs:string">
      <xs:whiteSpace value="collapse" />
      <xs:length value="9" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="t_niss">
    <xs:restriction base="xs:string">
      <xs:pattern value="\d{12}" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="t_sexo">
    <xs:restriction base="xs:string">
      <xs:enumeration value="M" />
      <xs:enumeration value="F" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="t_fecha">
    <xs:restriction base="xs:string">
      <xs:pattern value="(((0?[1-9]|[12][0-9]|3[01])(/)(0?[13578]|10|12)(/)(\d{4}))|(([0]?[1-9]|[12][0-9]|30)(/)(0?[469]|11)(/)(\d{4}))|((0?[1-9]|1[0-9]|2[0-8])(/)(0?2)(/)(\d{4}))|((29)(\.|-|/)(0?2)(/)([02468][048]00))|((29)(/)(0?2)(/)([13579][26]00))|((29)(/)(0?2)(/)([0-9][0-9][0][48]))|((29)(/)(0?2)(/)([0-9][0-9][2468][048]))|((29)(/)(0?2)(/)([0-9][0-9][13579][26])))" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="t_cadena100">
    <xs:restriction base="xs:string">
      <xs:maxLength value="100" />
      <xs:minLength value="1" />
      <xs:whiteSpace value="collapse" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="t_cadena4000">
    <xs:restriction base="xs:string">
      <xs:maxLength value="4000" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="t_NumeroParticipantes">
    <xs:restriction base="xs:nonNegativeInteger">
      <xs:totalDigits value="4" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="t_cadena75">
    <xs:restriction base="xs:string">
      <xs:maxLength value="75" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="t_cadena50">
    <xs:restriction base="xs:string">
      <xs:maxLength value="50" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="t_cadena30">
    <xs:restriction base="xs:string">
      <xs:maxLength value="30" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="t_codigoPostal">
    <xs:restriction base="xs:string">
      <xs:pattern value="[0-9]{5}" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="t_ctaCotiz">
    <xs:restriction base="xs:string">
      <xs:pattern value="[0-9]{1,20}" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="t_hora">
    <xs:restriction base="xs:string">
      <xs:pattern value="([0-1][0-9]|[2][0-3])(:)[0-5][0-9]" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="t_dias">
    <xs:restriction base="xs:string">
      <xs:pattern value="L?M?X?J?V?S?D?" />
    </xs:restriction>
  </xs:simpleType>
  <!-- Tipos Complejos -->
  <xs:complexType name="t_centro">
    <xs:sequence>
      <xs:element name="cif" type="t_cif_nif" />
      <xs:element name="nombreCentro" type="t_cadena100" />
      <xs:element name="direccionDetallada" type="t_cadena100" />
      <xs:element name="codPostal" type="t_codigoPostal" />
      <xs:element name="localidad" type="t_cadena75" />
      <xs:element name="pais" type="t_pais" minOccurs="0" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="t_horario">
    <xs:sequence>
      <xs:element name="horaInicioMañana" type="t_hora" minOccurs="0" />
      <xs:element name="horaFinMañana" type="t_hora" minOccurs="0" />
      <xs:element name="horaInicioTarde" type="t_hora" minOccurs="0" />
      <xs:element name="horaFinTarde" type="t_hora" minOccurs="0" />
      <xs:element name="dias" type="t_dias" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="modalidad">
    <xs:sequence>
      <xs:element name="centro" type="t_centro" />
      <xs:element name="lugarImparticion" type="t_centro" minOccurs="0" />
      <xs:element name="horario" type="t_horario" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="modalidad2">
    <xs:sequence>
      <xs:element name="centro" type="t_centro" />
      <xs:element name="lugarImparticion" type="t_centro" minOccurs="0" />
      <xs:element name="horario" type="t_horario" />
      <xs:element name="Tutor" type="t_Tutor" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="t_tipoFormacion">
    <xs:sequence>
      <xs:element name="mediosPropios" type="xs:boolean" />
      <xs:element name="mediosEntidadOrganizadora" type="xs:boolean" />
      <xs:element name="mediosCentro" type="xs:boolean" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="participante">
    <xs:sequence>
      <xs:element name="nif" type="t_nif" />
      <xs:element name="primerApellido" type="t_cadena30" />
      <xs:element name="segundoApellido" type="t_cadena30" />
      <xs:element name="nombre" type="t_cadena50" />
      <xs:element name="niss" type="t_niss" />
      <xs:element name="colPrioritario" type="xs:boolean" />
      <xs:element name="cifEmpresa" type="t_cif_nif" />
      <xs:element name="ctaCotiz" type="t_ctaCotiz" />
      <xs:element name="reserva" type="xs:boolean" />
    </xs:sequence>
  </xs:complexType>
  <xs:simpleType name="t_idGrupo">
    <xs:restriction base="xs:string">
      <xs:pattern value="[0-9]{1,11}" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="t_TipoTutor">
    <xs:restriction base="xs:int">
      <xs:totalDigits value="1" />
      <xs:pattern value="[1-2]" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="t_cadena20">
    <xs:restriction base="xs:string">
      <xs:maxLength value="20" />
      <xs:minLength value="1" />
      <xs:whiteSpace value="collapse" />
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="t_Tutor">
    <xs:sequence>
      <xs:element name="numeroHoras" type="xs:int" />
      <xs:element name="nif" type="t_nif" />
      <xs:element name="nombre" type="t_cadena20" />
      <xs:element name="apellido1" type="t_cadena20" />
      <xs:element name="apellido2" type="t_cadena20" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="t_EmpresaParticipante">
    <xs:sequence>
      <xs:element name="cifEmpresaParticipante" type="t_cif" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>
  <xs:element name="grupo">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="idAccion" type="t_idAccion" />
        <xs:element name="idGrupo" type="t_idGrupo" />
        <xs:element name="descripcion" type="t_cadena100" />
        <xs:element name="cumAportPrivada" type="xs:boolean" />
        <xs:element name="tipoFormacion" type="t_tipoFormacion" />
        <xs:element name="NumeroParticipante" type="t_NumeroParticipantes" />
        <xs:element name="fechaInicio" type="t_fecha" />
        <xs:element name="fechaFin" type="t_fecha" />
        <xs:element name="responsable" type="t_cadena100" />
        <xs:element name="jornadaPresencial" type="modalidad" minOccurs="0" />
        <xs:element name="tutoriaPresencial" type="modalidad2" minOccurs="0" />
        <xs:element name="distanciaTeleformacion" type="modalidad2" minOccurs="0" />
        <xs:element name="EmpresasParticipantes" type="t_EmpresaParticipante" minOccurs="1" />
        <xs:element name="observaciones" type="t_cadena4000" minOccurs="0" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
  #4 (permalink)  
Antiguo 24/09/2007, 00:33
Avatar de Expinete  
Fecha de Ingreso: abril-2006
Ubicación: Zaragoza
Mensajes: 236
Antigüedad: 18 años, 1 mes
Puntos: 3
Re: Crear XML a partir de XSD

Este es un ejemplo del XML que deberia salir:
Código PHP:
<?xml version="1.0" encoding="utf-8" ?>
 <grupo xmlns="http://www.fundaciontripartita.es/schemas" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.fundaciontripartita.es/schemas http://www.fundaciontripartita.es/schemas/InicioGrupos_Bonificada_Grupo.xsd">
  <idAccion>0200</idAccion>
  <idGrupo>10200</idGrupo>
  <descripcion>Grupo Formativo 10200</descripcion>
  <cumAportPrivada>0</cumAportPrivada>
 <tipoFormacion>
  <mediosPropios>1</mediosPropios>
  <mediosEntidadOrganizadora>0</mediosEntidadOrganizadora>
  <mediosCentro>1</mediosCentro>
  </tipoFormacion>
  <NumeroParticipante>10</NumeroParticipante>
  <fechaInicio>05/07/2007</fechaInicio>
  <fechaFin>20/07/2007</fechaFin>
  <responsable>Federico José Villa Roncoso</responsable>
 <jornadaPresencial>
 <centro>
  <cif>00000000T</cif>
  <nombreCentro>Abcde</nombreCentro>
  <direccionDetallada>c/ Debajo s/n</direccionDetallada>
  <codPostal>28043</codPostal>
  <localidad>Madrid</localidad>
  </centro>
 <horario>
  <horaInicioMañana>10:00</horaInicioMañana>
  <horaFinMañana>15:00</horaFinMañana>
  <dias>LXV</dias>
  </horario>
  </jornadaPresencial>
 <tutoriaPresencial>
 <centro>
  <cif>00000000T</cif>
  <nombreCentro>FGHIJ S.L.</nombreCentro>
  <direccionDetallada>plz. Luna 1 2 3</direccionDetallada>
  <codPostal>28043</codPostal>
  <localidad>Madrid</localidad>
  </centro>
 <horario>
  <horaInicioMañana>10:00</horaInicioMañana>
  <horaFinMañana>14:00</horaFinMañana>
  <dias>JV</dias>
  </horario>
 <Tutor>
  <numeroHoras>60</numeroHoras>
  <nif>00000000T</nif>
  <nombre>Ana</nombre>
  <apellido1>Bolado</apellido1>
  <apellido2>Navas</apellido2>
  </Tutor>
  </tutoriaPresencial>
 <distanciaTeleformacion>
 <centro>
  <cif>00000000T</cif>
  <nombreCentro>Jklhm S.A.</nombreCentro>
  <direccionDetallada>c/ Leganes 24 , Edificio C</direccionDetallada>
  <codPostal>28043</codPostal>
  <localidad>Madrid</localidad>
  </centro>
 <horario>
  <horaInicioMañana>09:00</horaInicioMañana>
  <horaFinMañana>15:00</horaFinMañana>
  <dias>LMV</dias>
  </horario>
 <Tutor>
  <numeroHoras>60</numeroHoras>
  <nif>00000000T</nif>
  <nombre>Juan</nombre>
  <apellido1>De Dios</apellido1>
  <apellido2>Sarabia</apellido2>
  </Tutor>
 <Tutor>
  <numeroHoras>30</numeroHoras>
  <nif>00000000T</nif>
  <nombre>Alberto</nombre>
  <apellido1>Gomera</apellido1>
  <apellido2>Heredia</apellido2>
  </Tutor>
  </distanciaTeleformacion>
  </grupo>
y este es el que me sale:
Código PHP:
  <?xml version="1.0" encoding="utf-8" ?> 
- <NewDataSet xmlns="http://www.fundaciontripartita.es/schemas">
- <grupo>
  <idAccion>447</idAccion> 
  <idGrupo>1</idGrupo> 
  <descripcion>GESTIÓN RPS:NUEVAS ADAPTACIONES DE COMPRAS</descripcion> 
  <cumAportPrivada>false</cumAportPrivada> 
  <NumeroParticipante>0</NumeroParticipante> 
  <fechaInicio>12/03/2007</fechaInicio> 
  <fechaFin>23/03/2007</fechaFin> 
  <responsable>CARLOS LIEDANA</responsable> 
  <observaciones /> 
- <tipoFormacion>
  <mediosPropios>true</mediosPropios> 
  <mediosEntidadOrganizadora>false</mediosEntidadOrganizadora> 
  <mediosCentro>false</mediosCentro> 
  </tipoFormacion>
- <jornadaPresencial>
- <centro>
  <cif>A50076413</cif> 
  <nombreCentro>SANEAMIENTOS MARIN SL</nombreCentro> 
  <direccionDetallada>CNO LAS TORRES, 100</direccionDetallada> 
  <codPostal>50008</codPostal> 
  <localidad>ZARAGOZA</localidad> 
  <pais>España</pais> 
  </centro>
- <lugarImparticion>
  <cif>A50076413</cif> 
  <nombreCentro>SANEAMIENTOS SL</nombreCentro> 
  <direccionDetallada>CNO LAS LILAS, 100</direccionDetallada> 
  <codPostal>50228</codPostal> 
  <localidad>MADRID</localidad> 
  <pais>España</pais> 
  </lugarImparticion>
- <horario>
  <horaInicioMañana>12:00</horaInicioMañana> 
  <horaFinMañana>13:00</horaFinMañana> 
  <horaInicioTarde>18:00</horaInicioTarde> 
  <horaFinTarde>19:30</horaFinTarde> 
  <dias>LMXV</dias> 
  </horario>
  </jornadaPresencial>
  <tutoriaPresencial /> 
  <distanciaTeleformacion /> 
- <EmpresasParticipantes>
  <cifEmpresaParticipante>A50076413</cifEmpresaParticipante> 
  </EmpresasParticipantes>
  </grupo>
  </NewDataSet>
Como veis hay alguna diferencia...
El código para obtener el xml es tan sencillo como:
Código PHP:
Dim fs As New System.IO.FileStream(fileNameXMLSystem.IO.FileMode.Create)
            
'Response.Write("Creo xml")

            ' 
Creamos un objeto XmlTextWriter para el
            
' objeto FileStream.
            '
            
Dim xtw As New System.Xml.XmlTextWriter(fsSystem.Text.Encoding.UTF8)

            
' Procesamos las instrucciones
            With xtw
                .WriteProcessingInstruction("xml", "version='
1.0' encoding='utf-8'")

                ' 
Escribimos los datos del objeto DataSet en el archivo XML.
                
'
                ds.WriteXml(xtw)

                ' 
Cerramos el objeto
                
                
.Close()
            
End With 
En si alguien sabe porque no me lo reconoce le estaría muy agradecido.
  #5 (permalink)  
Antiguo 24/09/2007, 09:33
 
Fecha de Ingreso: septiembre-2007
Mensajes: 52
Antigüedad: 16 años, 7 meses
Puntos: 2
Re: Crear XML a partir de XSD

Gracias por las explicaciones. Ahora me queda mucho más claro el asunto.

Como te podrás dar cuenta, el método WriteXml() de un DataSet arroja los datos usando siempre como nodo raíz un elemento extra (en este caso, "NewDataSet"), que por supuesto produce que el XML ya no valide con el esquema.

Entre las posibles opciones para lidiar con esto se me ocurre agregar un paso más que procese la salida producida por el DataSet con una plantilla XSL, y así producir el archivo final, que ya debería validar correctamente.

Te muestro aquí un ejemplo de cómo podría funcionar esto. Primero, aquí está una plantilla XSL que elimina el nodo raíz "NewDataSet". He puesto esto en un archivo con el nombre "dataset.xsl":

Código:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:f="http://www.fundaciontripartita.es/schemas"
                version="1.0">

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/f:NewDataSet">
    <xsl:apply-templates />
  </xsl:template>

</xsl:stylesheet>
Luego, unos ajustes en el código para usar la plantila XSL:

Código:
Dim datos_xml As String

' Recibir el XML desde el DataSet y ponerlo en una variable
datos_xml = ds.GetXml()

' Usar nuestra plantilla XSL
Dim xslt As New System.Xml.Xsl.XslCompiledTransform()
xslt.Load("dataset.xsl")

' Preparar archivo de salida
Dim fs As New System.IO.FileStream(fileNameXML, System.IO.FileMode.Create)
Dim xtw As New System.Xml.XmlTextWriter(fs, System.Text.Encoding.UTF8)

xtw.WriteProcessingInstruction("xml", "version='1.0' encoding='utf-8'")

Dim lector_xml As New System.Xml.XmlTextReader(New System.IO.StringReader(datos_xml))

' Procesar (esto coloca los resultados en fileNameXML)
xslt.Transform(lector_xml, xtw)
Por supuesto, este manejo extra (colocar el XML en una variable, procesarlo mediante XSL..) no es tan eficiente como un único llamado a DataSet.WriteXml(), pero suele haber un precio a pagar cuando los requerimientos van mas allá de lo que las bibliotecas ofrecen de forma directa :).
  #6 (permalink)  
Antiguo 01/10/2007, 03:46
Avatar de Expinete  
Fecha de Ingreso: abril-2006
Ubicación: Zaragoza
Mensajes: 236
Antigüedad: 18 años, 1 mes
Puntos: 3
Re: Crear XML a partir de XSD

Muchas gracias mhatter, intentare hacerlo así, porque lo que he hecho ha sido tratarlo como un archivo de texto y reemplazar lo que no era correcto....una chapucilla desde mi punto de vista pero para salir del paso funciona.
Gracias de nuevo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:43.