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

En este artículo se describe cómo dar formato y valores a las columnas del XML que se extrae DateTime Date de un ADO.NET DataTable DataSet objeto.

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

Resumen

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

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

Método 1: Usar clase XmlConvert

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

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

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

    Imports System.Xml
    Imports System.Text
    Imports System.Data.SqlClient
    
  4. Pegue el siguiente código 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 dirección URL, donde IISServerName es el nombre del http://IISServerName/DateTimeXmlConvert/WebForm1.aspx servidor Microsoft Internet Information Services (IIS).

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

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

Puede usar bloques de script en línea 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 en línea. Puede usar objetos de extensión para implementar rutinas personalizadas al diseñar hojas de estilos XSLT portátiles.

Crear un ASP.NET web

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

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

  3. Reemplace el código existente por el siguiente código de 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 secundario en la superficie del diseñador de WebForm1.aspx y, a continuación, haga clic en Ver código.

  6. Agregue el siguiente código al final de la sección de directivas Imports 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 siguiente código 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.

Crear un documento XSLT de ejemplo

  1. Agregue un nuevo archivo XSLT que se denomina DateTime.xslt al archivo web DateTimeXSLT ASP.NET web Project.

  2. Reemplace el código generado por el código siguiente. (Use el bloc de notas como una herramienta intermedia si experimenta algún problema de codificación o carácter 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.

Probar la transformación XSLT mediante el ASP.NET web form

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

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