Ver Mensaje Individual
  #5 (permalink)  
Antiguo 24/09/2007, 09:33
mhatter
 
Fecha de Ingreso: septiembre-2007
Mensajes: 52
Antigüedad: 17 años, 5 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 :).