zoukankan      html  css  js  c++  java
  • XML VS DataSet

    系列目录

    前言#

    通过前三篇介绍,相信大家对于XML已经有了很多的理解,后两篇将介绍XML和常用数据结构的转换。本篇我们一起讨论XML和DataSet(DataTable)之间的羁绊。

    XML与DataSet的关系#

    DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据库,DataSet是不依赖于数据库的独立数据集合。所谓独立,就是说,即使断开数据链路,或者关闭数据库,DataSet依然是可用的,DataSet在内部是用XML来描述数据的,由于XML是一种与平台无关、与语言无关的数据描述语言,而且可以描述复杂关系的数据,比如父子关系的数据,所以DataSet实际上可以容纳具有复杂关系的数据,而且不再依赖于数据库链路。[百度百科]

    在.NET Framework 中,经常使用XML 作为存储和传输各种数据的格式。DataSet 中的数据可以转换成XML 的形式来表示和存储。我们可以使用XML 对象同步和转换DataSet 的数据,而DataSet 也可以存储和传输XML 格式的数据。XML 与 DataSet 的关系如下图所示:

    不管是DataSet/DataTable 其实底层内部都是通过XML组织数据的。

    DataSet类与XML关联常用方法:

    1. ReadXml()
    2. ReadXmlSchema()
    3. WriteXml()
    4. WriteXmlSchema()
    5. GetXml()
    6. GetXmlSchema()
    

    XmlSchema是对XML的文档结构的描述。XmlSchema教程

    ReadXml/ReadXmlSchema##

    ReadXmlSchema只是转换结构,没有数据

    DataSet和XML相互转换(XmlDataSetConvert)#

    为了方便DS和XML转换这边整理对应的封装类 XmlDataSetConvert,类图如下:

    将xml字符串转换为DataSet##

    #region 将xml字符串转换为DataSet
    
    /// <summary>
    /// 将xml对象内容字符串转换为DataSet
    /// </summary>
    /// <param name="xmlData"></param>
    /// <returns></returns>
    public static DataSet XmlString2DataSet(string xmlData)
    {
        StringReader stream = null;
        XmlTextReader reader = null;
        DataSet xmlDS = null;
        try
        {
            xmlDS = new DataSet();
            using (stream = new StringReader(xmlData))
            {
                //从stream装载到XmlTextReader
                using (reader = new XmlTextReader(stream))
                {
                    xmlDS.ReadXml(reader);
                }
            }
            return xmlDS;
        }
        catch (System.Exception ex)
        {
            throw ex;
        }
        finally
        {
            if (reader != null) reader.Close();
        }
    }
    
    #endregion 将xml字符串转换为DataSet
    

    将xml文件转换为DataSet##

    #region 将xml文件转换为DataSet
    
    /// <summary>
    /// 将xml文件转换为DataSet
    /// </summary>
    /// <param name="xmlFile">文件路径</param>
    /// <returns></returns>
    public static DataSet XmlFile2DataSet(string xmlFile)
    {
        XmlTextReader reader = null;
        try
        {
            DataSet xmlDS = new DataSet();
    
            //从stream装载到XmlTextReader
            using (reader = new XmlTextReader(xmlFile))
            {
                xmlDS.ReadXml(reader);
            }
            //xmlDS.ReadXml(xmlFile);
            return xmlDS;
        }
        catch (System.Exception ex)
        {
            throw ex;
        }
        finally
        {
            if (reader != null) reader.Close();
        }
    }
    
    #endregion 将xml文件转换为DataSet
    

    将DataSet转换为xml对象字符串##

    #region 将DataSet转换为xml对象字符串
    
    /// <summary>
    ///  将DataSet转换为xml对象字符串
    /// </summary>
    /// <param name="xmlDS"></param>
    /// <returns></returns>
    public static string DataSet2XmlString(DataSet xmlDS)
    {
        MemoryStream stream = null;
        XmlTextWriter writer = null;
    
        try
        {
            stream = new MemoryStream();
            //从stream装载到XmlTextReader
            //writer = new XmlTextWriter(stream, Encoding.Unicode);//Unicode有点问题,可能是字符集不一致
            writer = new XmlTextWriter(stream, Encoding.Default);
    
            //用WriteXml方法写入文件.
            xmlDS.WriteXml(writer);
            int count = (int)stream.Length;
            byte[] arr = new byte[count];
            stream.Seek(0, SeekOrigin.Begin);
            stream.Read(arr, 0, count);
    
            //UnicodeEncoding utf = new UnicodeEncoding();
            //return utf.GetString(arr).Trim();
            return Encoding.Default.GetString(arr).Trim();
        }
        catch (System.Exception ex)
        {
            throw ex;
        }
        finally
        {
            if (writer != null) writer.Close();
        }
    }
    
    #endregion 将DataSet转换为xml对象字符串
    

    将DataSet转换为xml对象字符串##

    #region 将DataSet转换为xml文件
    
    /// <summary>
    /// 将DataSet转换为xml文件
    /// </summary>
    /// <param name="xmlDS"></param>
    /// <param name="xmlFile"></param>
    public static void DataSet2XmlFile(DataSet xmlDS, string xmlFile)
    {
        try
        {
            xmlDS.WriteXml(xmlFile);
        }
        catch (System.Exception ex)
        {
            throw ex;
        }
    
        #region 复杂实现方法
    
        //MemoryStream stream = null;
        //XmlTextWriter writer = null;
    
        //try
        //{
        //    stream = new MemoryStream();
        //    //从stream装载到XmlTextReader
        //    //writer = new XmlTextWriter(stream, Encoding.Unicode);
        //    writer = new XmlTextWriter(stream, Encoding.Default);
    
        //    //用WriteXml方法写入文件.
        //    xmlDS.WriteXml(writer);
        //    int count = (int)stream.Length;
        //    byte[] arr = new byte[count];
        //    stream.Seek(0, SeekOrigin.Begin);
        //    stream.Read(arr, 0, count);
    
        //    //返回Unicode编码的文本
        //    //UnicodeEncoding utf = new UnicodeEncoding();
        //    StreamWriter sw = new StreamWriter(xmlFile);
        //    sw.WriteLine("<?xml version="1.0" encoding="utf-8"?>");
        //    sw.WriteLine(Encoding.Default.GetString(arr).Trim());
        //    sw.Close();
        //}
        //catch (System.Exception ex)
        //{
        //    throw ex;
        //}
        //finally
        //{
        //    if (writer != null) writer.Close();
        //}
    
        #endregion 复杂实现方法
    }
    
    #endregion 将DataSet转换为xml文件
    

    总结#

    这边主要谈DataSet和XML关系。并总结封装了他们转换的类源代码

    XML 与DataSet 对象的关系
    参考地址
    百度百科

  • 相关阅读:
    腾讯一面有感(移动开发岗位)
    kafka 在java中的使用
    Kafka史上最详细原理总结下
    java jdk原生的http请求工具类
    kafka(一)
    MySQL:互联网公司常用分库分表方案汇总
    密码正则
    springboot 打war包
    oracle存储过程的一些使用
    对象的深度克隆
  • 原文地址:https://www.cnblogs.com/wxc-kingsley/p/Xml-004.html
Copyright © 2011-2022 走看看