Cómo dar formato a los valores DateTime y Date en el XML extraído de un ADO.NET DataSet mediante Visual Basic .NET

En este artículo se describe cómo dar formato DateTime y los valores de DataTable las columnas en el XML que se extrae de un objeto ADO.NET DataSetDate.

Versión original del producto: Visual Basic .NET
Número de KB original: 811767

Resumen

En ADO.NET, los DateTime valores y Date de DataTable las columnas se escriben en el XSD DateTime y Date los formatos cuando DataSet se guarda como XML. Los formatos y XSD DateTime estándar son CCYY-MM-DDThh:mm:ss y CCYY-MM-DD, respectivamente, porque el esquema XSD subyacente de asigna DataSet las DateTime columnas y Date de la base de datos a los DateTime tipos de datos XSD DateDate y .

Para generar XML donde DateTime y Date los valores se representan en los formatos personalizados necesarios, use uno de los métodos siguientes.

Método 1: Usar la clase XmlConvert

  1. Abra Microsoft Visual Studio .NET. En Visual Basic .NET, cree un nuevo proyecto de aplicación web ASP.NET denominado DateTimeXmlConvert.

  2. Haga clic con el botón derecho en la superficie del diseñador de WebForm1.aspx y, a continuación, haga clic en Ver código.

  3. Agregue el código siguiente al final de la sección de Imports directivas en WebForm1.aspx.vb:

    Imports System.Xml
    Imports System.Text
    Imports System.Data.SqlClient
    
  4. Pegue el código siguiente en el Page_Load evento:

    ' Change SqlServerName, UserId and Password in the following connection string.
    Dim conn As String = "Server=<SQLServerName>; database=Northwind; user id=<UserID>; password=<Password>;"
    Dim connection As SqlConnection = New SqlConnection()
    connection.ConnectionString = conn
    
    Dim objDataSet As DataSet = New DataSet()
    Dim objAdapter As SqlDataAdapter = New SqlDataAdapter()
    Dim objCmd As SqlCommand = New SqlCommand()' Retrieve the first 10 records from the employees table.
    objCmd.CommandText = "select top 10 FirstName,BirthDate from employees"
    objCmd.Connection = connection
    objAdapter.SelectCommand = objCmd
    objAdapter.Fill(objDataSet)
    
    connection.Close()' Create an instance of XmlTextReader class that reads the XML data.
    Dim xmlReader As XmlTextReader = New XmlTextReader(objDataSet.GetXml(),XmlNodeType.Element,Nothing)
    
    Response.ContentType = "text/xml"
    Dim xmlWriter As XmlTextWriter = New XmlTextWriter(Response.OutputStream,Encoding.UTF8)
    xmlWriter.Indentation = 4
    xmlWriter.WriteStartDocument()
    Dim elementName As String = ""
    
    ' Parse & display each node
    While xmlReader.Read()
        Select Case xmlReader.NodeType
            Case XmlNodeType.Element
                xmlWriter.WriteStartElement(xmlReader.Name)
                elementName = xmlReader.Name
    
            Case XmlNodeType.Text
                If elementName.ToLower() = "birthdate" Then
                    xmlWriter.WriteString(XmlConvert.ToDateTime(xmlReader.Value).ToString())
                Else
                    xmlWriter.WriteString(xmlReader.Value)
                End If
    
            Case XmlNodeType.EndElement
                xmlWriter.WriteEndElement()
        End Select
    End While
    xmlWriter.Close()
    
  5. Guarde los cambios en WebForm1.aspx.vb.

  6. On the Build menu, click Build Solution.

  7. Inicie Microsoft Internet Explorer y abra WebForm1.aspx especificando la http://IISServerName/DateTimeXmlConvert/WebForm1.aspx dirección URL, donde IISServerName es el nombre del servidor de Microsoft Internet Information Services (IIS).

Ahora puede ver que el archivo XML que se representa en el explorador se muestra en formato personalizado DateTime .

Método 2: Aplicar una transformación XSLT en la representación XML de los datos de DataSet

Puede usar bloques de script insertados y componentes de código externo, conocidos como objetos de extensión XSLT, para implementar rutinas personalizadas. Se invocan durante una XSLT para realizar cálculos y procesar datos. Microsoft recomienda evitar el uso de bloques de script insertados. Puede usar objetos de extensión para implementar rutinas personalizadas al diseñar hojas de estilos XSLT portátiles.

Creación de un formulario web de ASP.NET

  1. Cree un nuevo proyecto de aplicación web de .NET de Visual Basic ASP.NET denominado DateTimeXSLT.

  2. Agregue una nueva clase denominada DateConvertor.vb al proyecto.

  3. Reemplace el código existente por el código siguiente en la DateConvertor clase :

    Public Class DateConvertor
        Public Function GetDateTime(ByVal data As String, ByVal format As String) As String
            Dim dt As DateTime = DateTime.Parse(data)
            Return dt.ToString(format)
        End Function
    End Class
    
  4. Guarde los cambios en DateConvertor.vb.

  5. Haga clic con el botón derecho en la superficie del diseñador de WebForm1.aspx y, a continuación, haga clic en Ver código.

  6. Agregue el código siguiente al final de la sección de Imports directivas en WebForm1.aspx.vb:

    Imports System.IO
    Imports System.Xml
    Imports System.Xml.Xsl
    Imports System.Xml.XPath
    Imports System.Data.SqlClient
    
  7. Pegue el código siguiente en el Page_Load evento:

    ' Change SqlServerName, UserId and Password in the following connection string.
    Dim strConn As String = "Server=<SQLServerName>; database=Northwind; user id=<UserID>; password=<Password>;"
    Dim connection As SqlConnection = New SqlConnection()
    connection.ConnectionString = strConn
    
    Dim objDataSet As DataSet = New DataSet()
    Dim objAdapter As SqlDataAdapter = New SqlDataAdapter()
    Dim objCmd As SqlCommand = New SqlCommand()' Retrieve all records from employees table.
    objCmd.CommandText = "select FirstName,BirthDate from employees"
    objCmd.Connection = connection
    objAdapter.SelectCommand = objCmd
    objAdapter.Fill(objDataSet)
    
    connection.Close()' Create an instance of StringReader class that reads the XML data.
    Dim reader As StringReader = New StringReader(objDataSet.GetXml())
    Dim doc As XPathDocument = New XPathDocument(reader)' Create an XslTransform object and load xslt file.
    Dim transform As XslTransform = New XslTransform()
    transform.Load(Me.MapPath("DateTime.xslt"))'Add an object to convert DateTime format.
    Dim objDateConvertor As DateConvertor = New DateConvertor()
    Dim args As XsltArgumentList = New XsltArgumentList()
    args.AddExtensionObject("urn:ms-kb", objDateConvertor)
    
    transform.Transform(doc, args, Response.OutputStream)
    
  8. Guarde los cambios en WebForm1.aspx.vb.

Creación de un documento XSLT de ejemplo

  1. Agregue un nuevo archivo XSLT denominado DateTime.xslt al proyecto web de ASP.NET DateTimeXSLT.

  2. Reemplace el código generado por el código siguiente. (Use el Bloc de notas como herramienta intermediaria si experimenta problemas de codificación o caracteres al intentar pegar el código siguiente).

    <?xml version='1.0'?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:myObj="urn:ms-kb">
        <xsl:template match="NewDataSet">
            <table>
                <xsl:attribute name="border">1</xsl:attribute>
                  <TR>
                      <TD>Employee name</TD>
                      <TD>Original DateTime Format</TD>
                      <TD>Changed DateTime Format</TD>
                  </TR>
                <xsl:apply-templates select="*"/>
            </table>
        </xsl:template>
        <xsl:template match="*">
            <TR>
                <xsl:apply-templates select="*"/>
            </TR>
        </xsl:template>
        <xsl:template match="FirstName">
            <TD>
                <xsl:value-of select="."/>
            </TD>
        </xsl:template>
        <xsl:template match="BirthDate">
        <xsl:variable name="Date" select="."/>
            <TD>
                <xsl:value-of select="$Date"/>
            </TD>
            <TD>
                <xsl:value-of select="myObj:GetDateTime($Date, 'F')"/>
            </TD>
        </xsl:template>
    </xsl:stylesheet>
    
  3. Guarde los cambios en DateTime.xslt.

Prueba de la transformación XSLT mediante el formulario web de ASP.NET

  1. Guarde los cambios en el proyecto web de ASP.NET DateTimeXSLT.
  2. On the Build menu, click Build Solution.
  3. Inicie Internet Explorer y abra WebForm1.aspx especificando la http://IISServerName/DateTimeXSLT/WebForm1.aspx dirección URL, donde IISServerName es el nombre del servidor IIS.

Ahora puede ver que dos DateTime formatos, el DateTime formato de DataSet y el formato transformado DateTime en la página WebForm1.aspx .