解析.NET框架下的数据类型转化技术

  • 来源: 天极yesky 作者: 若水   2008-04-12/16:02
  • [前言]XML技术是微软.NET战略的一个重要基础,其在.NET开发中的作用自然是不言而喻的。随着XML Web服务的日益发展以及各种异构平台下数据交换的需求日益增加,XML逐渐在成为数据存储的一种重要方式。然而目前更多的数据是以关系型数据的方式存在的,这样将关系型数据转化为XML数据并进而呈现给最终用户成了开发人员的一项主要工作。.NET不仅以XML为基础,而且对XML标准有十分完美的支持。在.NET开发环境下,开发人员只要以很小的代价就可以达到数据类型转化并将数据以特定格式呈现给最终用户的目的。

    基本原理:

    .NET框架中包含了一个专门用于处理XML的命名空间-System.Xml,其中包含了相当多的与XML相关的类。其子命名空间包括:System.Xml.Serialization,System.Xml.Schema,System.Xml.XPath,System.Xml.Xsl,这些子命名空间包含了与XML相关的更具体的类。其中的System.Xml和System.Xml.Xsl正是开发人员完成数据类型转化并以特定格式将数据呈现给最终用户所必须的命名空间,前者包括的XmlDataDocument类能从ADO.NET中的DataSet对象获取关系型数据并以XML的格式存储之,同时它是XmlDocument类的一个子类,所以是基于文档对象模型(DOM)的。而后者所包括的XslTransform类是完成XSLT转换的重要类,该类可以根据一个XmlDataDocument对象以及一个相应的XSLT文件完成XML数据格式的转换,也即它能将XML数据以HTML的方式显示出来,这样就达到了以特定格式将XML数据呈现给最终用户的目的了。

    关系型数据转化为XML数据的过程中,我们运用了一个XmlDataDocument对象从DataSet对象中获取数据,其实这个过程是将XmlDataDocument对象和DataSet对象同步化的过程。一旦这两个对象被同步化了,那么对于任何一个对象的数据操作都会在另一个对象中反映出来。这样开发人员就可以同时运用XSLT技术以及ADO.NET相关的技术访问并操作数据了。同步化这两个对象的方法一般包括以下三种:

    1. 首先将一个XML文档导入到一个XmlDataDocument对象中,然后访问其DataSet属性。值得注意的是,在运用XmlDataDocument对象访问数据前必须设置好DataSet属性的模式,同时将数据表和列分别匹配到XML中相应的元素上。还有,模式是大小写敏感的。

    2. 先创建一个带有模式的DataSet对象,然后将一个XML文档直接导入到一个XmlDataDocument对象中并使之与前面的DataSet对象同步化。这种方式适合于XML文档非常大的情况,但是只要你把它和DataSet对象中的关系视图同步化,其中的元素也就和DataSet对象中的模式相对应起来了。

    3. 最简单的方法!根据一个已有的DataSet对象创建一个全新的XmlDataDocument对象。基本代码如下:

    DataSet ds = new DataSet();
    // 在此包含填充DataSet对象的代码
    XmlDataDocument xmldd = new XmlDataDocument(ds);



    实例介绍

    下面我向大家介绍一个示例性的ASP.NET Web应用程序,该程序能从SQL Server 2000中的Northwind数据库中获取关系型数据并填充到一个DataSet对象中。该Web应用程序使用上面介绍的第三种方法同步化DataSet对象和XmlDataDocument对象,以完成从关系型数据到XML数据的转化工作。最后该Web应用程序根据一个预先编写好的XSLT文件实现从XML格式到HTML格式的数据转换,其中运用到的主要类便是XslTransform类。所以总体来看该Web应用程序并不复杂,不过它良好地体现了.NET框架下不同数据类型的转化方法和技巧,值得大家学习。

    首先打开Visual Studio.Net,创建一个Visual C#的ASP.NET Web应用程序,如图1所示:


    图1

    接着从SQL Server 2000的Northwind数据库中获取数据并填充到一个DataSet对象中。Northwind数据库中包含了一个Suppliers表和一个Products表,它们之间存在着一对多的关系,该关系以两个表中的SupplierID列为关联键。该关系能显示每个供应商所能供应的所有产品列表,假设该Web应用程序就是要显示这些信息,那么下面就是获取DataSet对象的方法了。

    private DataSet GetDataSet()
    {
    try
    {
    // 创建SqlConnection对象、两个SqlDataAdapter对象以及一个DataSet对象
    SqlConnection con = new SqlConnection("server=localhost;initial catalog=Northwind;integrated security=true;");
    SqlDataAdapter daSuppliers = new SqlDataAdapter("SELECT * FROM Suppliers", con);
    SqlDataAdapter daProducts = new SqlDataAdapter("SELECT * FROM Products", con);
    DataSet ds = new DataSet("SuppliersProductsDS");

    // 打开连接,并用上面的两个SqlDataAdapter对象填充DataSet对象,最后关闭连接
    con.Open();
    daSuppliers.Fill(ds, "Suppliers");
    daProducts.Fill(ds, "Products");
    con.Close();

    // 在DataSet对象中添加必要的关系,该关系是一对多类型的
    ds.Relations.Add("SuppliersProducts", ds.Tables["Suppliers"].Columns["SupplierID"], ds.Tables["Products"].Columns["SupplierID"]).Nested = true;

    // 返回DataSet对象
    return ds;
    }
    catch (Exception)
    {
    return null;
    }
    }

    上面的代码能将Northwind数据库中的Suppliers表和Products表的数据运用SqlDataAdapter对象的Fill()方法填充到一个DataSet对象中,然后在这两个数据表之间根据每个表中的SupplierID列建立一个一对多关系。

    现在,你已经从后台数据库中获取数据并填充到DataSet对象了,不过要根据DataSet对象格式化输出结果是比较困难的,除非你使用像DataGrid那样的数据绑定控件。然而使用该类控件将使得输出结果的显示方式不富于变化,那也就可能不能满足应用程序的需求了。于是,你得先将数据格式转化为XML格式并运用XSLT技术将数据以HTML的方式显示给最终用户。所以,下面先得创建一个XSLT样式表文件。为该项目添加一个新项,如图2所示:

     
    图2

    样式表文件自身就是一个XML文件,其中包含了一个或多个XSLT模板。这些模板能根据其中的指令对源XML文件中的元素进行逐个处理并生成相应结果。编辑该样式表文件如下:

    <?xml version="1.0" encoding="UTF-8" ?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="SuppliersProductsDS">
    <HTML>
    <HEAD>
    <TITLE>XmlDataDocument Transformation!</TITLE>
    </HEAD>
    <STYLE>
    BODY{ font-family:verdana;font-size:9pt }
    TD { font-size:8pt }
    </STYLE>
    <BODY>
    <xsl:apply-templates select="Suppliers"></xsl:apply-templates>
    </BODY>
    </HTML>
    </xsl:template>

    <xsl:template match="Suppliers">
    <TABLE>
    <TR><TD>
    <B>
    <xsl:value-of select="CompanyName"></xsl:value-of>
    <xsl:value-of select="Phone"></xsl:value-of>
    </B>
    </TD></TR>
    </TABLE>
    <xsl:apply-templates select="Products"></xsl:apply-templates>
    <BR></BR>
    </xsl:template>

    <xsl:template match="Products">
    <TABLE BORDER="1">
    <TR>
    <TD valign="top" bgcolor="#E0E0E0">
    <B>Product:</B>
    </TD>
    <TD valign="top">
    <xsl:value-of select="ProductName"></xsl:value-of>
    </TD>
    </TR>
    <TR>
    <TD valign="top" bgcolor="#E0E0E0">
    <B>QuantityPerUnit:</B>
    </TD>
    <TD valign="top">
    <xsl:value-of select="QuantityPerUnit"></xsl:value-of>
    </TD>
    </TR>
    <TR>
    <TD valign="top" bgcolor="#E0E0E0">
    <B>UnitPrice:</B>
    </TD>
    <TD valign="top">
    <xsl:value-of select="UnitPrice"></xsl:value-of>
    </TD>
    </TR>
    </TABLE>
    </xsl:template>
    </xsl:stylesheet>

    最后便是根据上面创建并填充的DataSet对象创建一个新的XmlDataDocument对象,然后根据样式表文件将XML数据转换为HTML格式的数据并呈现给最终用户。XSLT转换过程涉及到三个文件:一个为源XML文件,它是被处理的对象;一个样式表文件,它是XSLT转换的工具;还有一个就是输出结果文件。XSLT转换过程运用到了XslTransform类的Load()方法和Transform()方法,其作用分别是导入样式表和进行实际的转换。下面,添加Web页面的Load事件响应函数如下:

    private void Page_Load(object sender, System.EventArgs e)
    {
    try
    {
    // 根据一个已有的DataSet对象创建一个新的XmlDataDocument对象
    DataSet ds = this.GetDataSet();
    XmlDataDocument xdd = new XmlDataDocument(ds);

    // 创建一个XslTranform对象并导入XSLT样式表文件
    XslTransform xslt = new XslTransform();
    xslt.Load(Server.MapPath("SuppliersProducts.xslt"));

    // 进行XSLT转换并输出结果到一个流对象
    MemoryStream ms = new MemoryStream();
    xslt.Transform(xdd, null, ms);
    ms.Seek(0, SeekOrigin.Begin);
    StreamReader sr = new StreamReader(ms);

    // 显示输出结果
    Response.Write(sr.ReadToEnd());
    }
    catch (Exception) {}
    }

    运行该Web应用程序的结果如图3所示:

     
    图3

    总结

    以上我向大家阐述了.NET框架下数据类型转化的基本方法和技巧,其中的Web应用程序从后台数据库中获取了关系型的数据并根据DataSet对象和XmlDataDocument对象的同步化原理将数据转化为了XML类型的数据,最后它还运用到了XSLT技术将XML数据以HTML的格式呈现给最终用户,所以该实例良好地体现了.NET框架下与数据转化相关的技术,不失为一个好例子。最后,希望本文能对大家有不少帮助!


    评论 {{userinfo.comments}}

    {{money}}

    {{question.question}}

    A {{question.A}}
    B {{question.B}}
    C {{question.C}}
    D {{question.D}}
    提交

    驱动号 更多