XmlTextReader实例(加载表数据)

以下代码是读取xml的内容,包括列字段信息和表数据.采用线程读取各个表的数据.针对特定的XML格式

        private string fileName;
        private XmlTextWriter writer;
        /// <summary>
        /// 数据库类型
        /// </summary>
        private DataBaseType dataBaseType;
        /// <summary>
        /// 表名
        /// </summary>
        private DataTable tableNames = new DataTable();
        private Dictionary<string, DataTable> tableSchemas = new Dictionary<string, DataTable>();
        private Dictionary<string, DataTable> tableDatas = new Dictionary<string, DataTable>();
        private Dictionary<string, string> tableSQLs = new Dictionary<string, string>();
        private Dictionary<string, DataTable> tableColInfos = new Dictionary<string, DataTable>();

        /// <summary>
        /// 读取数据时必须先调用 LoadOffLineData()
        /// 写数据时必须先调用 InitXmlTextWriter()
        /// </summary>
        /// <param name="fileName"></param>
        public FileHelper(string fileName)
        {
            this.fileName = fileName;
        }

相关定义

       /// <summary>
        /// 根据类型名称获取对应的类型
        /// </summary>
        /// <param name="typeName"></param>
        /// <returns></returns>
        private Type GetType(string typeName)
        {
            Type type = typeof(Object);
            typeName = typeName.ToLower().Trim();
            switch (dataBaseType)
            {
                case DataBaseType.Access:
                    break;
                case DataBaseType.DB2:
                    break;
                case DataBaseType.MySql:
                    break;
                case DataBaseType.Odbc:
                    break;
                case DataBaseType.Oracle:
                    break;
                case DataBaseType.SqlCe:
                    break;
                case DataBaseType.SqlServer:
                    switch (typeName)
                    {
                        case "int":
                        case "smallint":
                        case "bigint":
                            type = typeof(int);
                            break;
                        case "bit":
                            type = typeof(Boolean);
                            break;
                        case "datetime":
                        case "smalldatetime":
                            type = typeof(DateTime);
                            break;
                        case "decimal":
                        case "numeric":
                        case "smallmoney":
                            type = typeof(Decimal);
                            break;
                        case "float":
                            type = typeof(Double);
                            break;
                        case "image":
                        case "money":
                        case "binary":
                        case "sql_variant":
                        case "timestamp":
                        case "varbinary":
                        case "uniqueidentifier":
                        case "xml":
                            type = typeof(Object);
                            break;
                        case "ntext":
                        case "varchar":
                        case "nvarchar":
                        case "text":
                        case "nchar":
                        case "char":
                            type = typeof(String);
                            break;
                        case "real":
                            type = typeof(Single);
                            break;
                        case "tinyint":
                            type = typeof(Byte);
                            break;
                    }
                    break;
            }

            return type;
        }

GetType

        /// <summary>
        /// 加载离线数据
        /// </summary>
        /// <returns></returns>
        public bool LoadOffLineData()
        {
            XmlTextReader reader = new XmlTextReader(fileName);
            tableNames.Columns.Add("name");
            if (reader.ReadToFollowing("database"))
            {
                try
                {
                    dataBaseType = (DataBaseType)Enum.Parse(typeof(DataBaseType), reader.GetAttribute("databasetype"));
                    while (reader.ReadToFollowing("table"))
                    {
                        tableNames.Rows.Add(reader.GetAttribute("name"));
                        Thread th = new Thread(AnalyzeTableXml);
                        th.Start(reader.ReadOuterXml());
                    }
                }
                catch (Exception err)
                {
                    dataBaseType = DataBaseType.SqlServer;
                    this.LogWrite(LogType.Error, "加载离线数据出错!", err);
                    return false;
                }
            }

            reader.Close();
            return true;
        }

LoadOffLineData

        /// <summary>
        /// 分析表结构与读取表数据
        /// </summary>
        /// <param name="obj"></param>
        private void AnalyzeTableXml(object obj)
        {
            string tableName = "";
            try
            {
                XmlTextReader reader = new XmlTextReader(obj.ToString(), XmlNodeType.Document, null);
                if (reader.ReadToFollowing("table"))
                {
                    //作为Key值,表名全为小写
                    tableName = reader.GetAttribute("name").Trim().ToLower();
                    DataTable dtSchema = new DataTable();
                    DataTable dtColInfo = new DataTable();
                    DataTable dataDt = new DataTable();
                    dtSchema.TableName = tableName;
                    dtColInfo.TableName = tableName;
                    dataDt.TableName = tableName;
                    tableSchemas.Add(tableName, dtSchema);
                    tableColInfos.Add(tableName, dtColInfo);
                    tableDatas.Add(tableName, dataDt);

                    //读取建表语句
                    if (reader.ReadToDescendant("createsql") && !reader.IsEmptyElement)
                    {
                        tableSQLs.Add(tableName, reader.ReadElementString().Trim());
                    }
                    else
                    {
                        this.LogWrite(LogType.Info, "表[{0}]没有建表语句!".Formats(tableName));
                    }

                    //读取列(结构)
                    if (reader.ReadToNextSibling("columns") && !reader.IsEmptyElement)
                    {
                        //第一列
                        if (reader.ReadToDescendant("column"))
                        {
                            AddColumn(reader, dtSchema);
                            AddColInfo(reader, dtColInfo);
                            dataDt.Columns.Add(reader.GetAttribute("col_name"));//添加列
                            //循环读取其它列
                            while (reader.ReadToNextSibling("column"))
                            {
                                AddColumn(reader, dtSchema);
                                AddColInfo(reader, dtColInfo);
                                dataDt.Columns.Add(reader.GetAttribute("col_name"));//添加列
                            }
                        }
                    }
                    else
                    {
                        this.LogWrite(LogType.Info, "表[{0}]没有结构信息!".Formats(tableName));
                        return;
                    }

                    //读取行(数据)
                    if (reader.ReadToNextSibling("rows") && !reader.IsEmptyElement)
                    {
                        //第一行
                        if (reader.ReadToDescendant("row") && !reader.IsEmptyElement)
                        {
                            do
                            {
                                //第一单元格
                                if (reader.ReadToDescendant("cell"))
                                {
                                    DataRow dr = dataDt.Rows.Add();
                                    dr[reader.GetAttribute("columnname")] = reader.ReadElementString().Trim();
                                    //循环读取其它单元格
                                    while (reader.ReadToNextSibling("cell"))
                                    {
                                        dr[reader.GetAttribute("columnname")] = reader.ReadElementString().Trim();
                                    }
                                }
                            }
                            while (reader.ReadToNextSibling("row") && !reader.IsEmptyElement);
                        }
                    }
                }

                reader.Close();
            }
            catch (Exception err)
            {
                this.LogWrite(LogType.Error, "分析表[{0}]XML出错!".Formats(tableName), err);
            }
        }

AnalyzeTableXml

        /// <summary>
        /// 添加列
        /// </summary>
        /// <param name="reader"></param>
        /// <param name="dtSchema"></param>
        private void AddColumn(XmlTextReader reader, DataTable dtSchema)
        {
            DataColumn dc = dtSchema.Columns.Add(reader.GetAttribute("col_name"));
            dc.DataType = GetType(reader.GetAttribute("col_typename"));
            dc.AllowDBNull = bool.Parse(reader.GetAttribute("col_null"));
            dc.AutoIncrement = bool.Parse(reader.GetAttribute("col_identity") == "" ? "false" : reader.GetAttribute("col_identity"));

            if (dc.AutoIncrement)
            {
                dc.AutoIncrementSeed = long.Parse(reader.GetAttribute("col_seed") == "" ? "0" : reader.GetAttribute("col_seed"));
                dc.AutoIncrementStep = long.Parse(reader.GetAttribute("col_increment") == "" ? "0" : reader.GetAttribute("col_increment"));
            }

            if (dc.DataType == typeof(string))
            {
                dc.MaxLength = Int32.Parse(reader.GetAttribute("col_len") == "" ? Int64.MaxValue.ToString() : reader.GetAttribute("col_len"));
            }
        }

AddColumn

        /// <summary>
        /// 添加列的行信息
        /// </summary>
        /// <param name="reader"></param>
        /// <param name="dtColInfo"></param>
        private void AddColInfo(XmlTextReader reader, DataTable dtColInfo)
        {
            DataRow dr = dtColInfo.Rows.Add();
            for (int i = 0; i < reader.AttributeCount; i++)
            {
                reader.MoveToAttribute(i);
                if (!dtColInfo.Columns.Contains(reader.Name))
                {
                    dtColInfo.Columns.Add(reader.Name);
                }
                dr[reader.Name] = reader.Value;
            }
        }

AddColInfo

<?xml version="1.0" encoding="utf-8"?>
<database databasetype="0">
  <tables>
    <table name="IncidentTemplate">
      <createsql>CREATE   TABLE   [dbo].[IncidentTemplate](
     [ID]   [int]   IDENTITY(1,   1)   NOT   NULL,
     [alarmtype]   [int]   NULL,
     [content]   [nvarchar](2000)   NULL,
     CONSTRAINT   [PK_INCIDENTTEMPLATE]   PRIMARY   KEY   CLUSTERED([ID])
)

EXEC   sys.sp_addextendedproperty   @name=N‘MS_Description‘,   @value=N‘案件模板‘   ,@level0type=N‘SCHEMA‘,   @level0name=N‘dbo‘,   @level1type=N‘TABLE‘,   @level1name=N‘IncidentTemplate‘

EXEC   sys.sp_addextendedproperty   @name=N‘MS_Description‘,   @value=N‘序号‘   ,@level0type=N‘SCHEMA‘,   @level0name=N‘dbo‘,   @level1type=N‘TABLE‘,   @level1name=N‘IncidentTemplate‘,   @level2type=N‘COLUMN‘,   @level2name=N‘ID‘

EXEC   sys.sp_addextendedproperty   @name=N‘MS_Description‘,   @value=N‘案件性质‘   ,@level0type=N‘SCHEMA‘,   @level0name=N‘dbo‘,   @level1type=N‘TABLE‘,   @level1name=N‘IncidentTemplate‘,   @level2type=N‘COLUMN‘,   @level2name=N‘alarmtype‘

EXEC   sys.sp_addextendedproperty   @name=N‘MS_Description‘,   @value=N‘模板内容‘   ,@level0type=N‘SCHEMA‘,   @level0name=N‘dbo‘,   @level1type=N‘TABLE‘,   @level1name=N‘IncidentTemplate‘,   @level2type=N‘COLUMN‘,   @level2name=N‘content‘</createsql>
      <columns>
        <column col_name="ID" col_id="1" col_typename="int" col_len="4" col_prec="" col_scale="" col_basetypename="int" col_defname="" col_rulname="" col_null="False" col_identity="True" col_flags="4" col_seed="1" col_increment="1" col_dridefname="" text="" col_iscomputed="0" text1="" col_NotForRepl="False" col_fulltext="False" col_AnsiPad="" col_DOwner="" col_DName="" col_ROwner="" col_RName="" collation="" ColType="" Column1="1" Column2="0" />
        <column col_name="alarmtype" col_id="2" col_typename="int" col_len="4" col_prec="" col_scale="" col_basetypename="int" col_defname="" col_rulname="" col_null="True" col_identity="False" col_flags="0" col_seed="" col_increment="" col_dridefname="" text="" col_iscomputed="0" text1="" col_NotForRepl="False" col_fulltext="False" col_AnsiPad="" col_DOwner="" col_DName="" col_ROwner="" col_RName="" collation="" ColType="" Column1="1" Column2="0" />
        <column col_name="content" col_id="3" col_typename="nvarchar" col_len="2000" col_prec="" col_scale="" col_basetypename="nvarchar" col_defname="" col_rulname="" col_null="True" col_identity="False" col_flags="1" col_seed="" col_increment="" col_dridefname="" text="" col_iscomputed="0" text1="" col_NotForRepl="False" col_fulltext="False" col_AnsiPad="" col_DOwner="" col_DName="" col_ROwner="" col_RName="" collation="Chinese_PRC_CI_AS" ColType="" Column1="1" Column2="0" />
      </columns>
      <rows>
        <row>
          <cell columnname="ID">54</cell>
          <cell columnname="alarmtype">151</cell>
          <cell columnname="content"></cell>
        </row>
        <row>
          <cell columnname="ID">55</cell>
          <cell columnname="alarmtype">160</cell>
          <cell columnname="content">
        <row>
          <cell columnname="ID">56</cell>
          <cell columnname="alarmtype">155</cell>
          <cell columnname="content"></cell>
        </row>
        <row>
          <cell columnname="ID">57</cell>
          <cell columnname="alarmtype">158</cell>
          <cell columnname="content"></cell>
        </row>
        <row>
          <cell columnname="ID">62</cell>
          <cell columnname="alarmtype">131</cell>
          <cell columnname="content"></cell>
        </row>
        <row>
          <cell columnname="ID">63</cell>
          <cell columnname="alarmtype">149</cell>
          <cell columnname="content"></cell>
        </row>
        <row>
          <cell columnname="ID">64</cell>
          <cell columnname="alarmtype">174</cell>
          <cell columnname="content"></cell>
        </row>
      </rows>
    </table>
  </tables>
</database>

xml

时间: 2024-07-30 10:17:52

XmlTextReader实例(加载表数据)的相关文章

ajax验证表单元素规范正确与否 ajax展示加载数据库数据 ajax三级联动

一.ajax验证表单元素规范正确与否 以用ajax来验证用户名是否被占用为例 1创建表单元素<input type="text" id="t"> 2在js中用keyup事件来进行操作 3创建ajax格式和内容:格式: $.ajax({ url:"哪一个服务端处理器", data:{"自己起名",所需要传给处理器的数据}, type:"post", dataType:"json"

hive加载json数据解决方案

hive官方并不支持json格式的数据加载,默认支持csv格式文件加载,如何在不依赖外部jar包的情况下实现json数据格式解析,本编博客着重介绍此问题解决方案 首先创建元数据表: create EXTERNAL table access_log (content string) row format delimited fields terminated by '\t' STORED AS INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInpu

SQLLoader8(加载的数据中有换行符处理方法)

SQLLDR加载的数据中有换行符处理方法1.创建测试表: CREATE TABLE MANAGER( MGRNO NUMBER, MNAME VARCHAR2(30), JOB VARCHAR2(30), REMARK VARCHAR2(1000) ); 2.创建控制文件我们可以通过控制文件,在数据加载前处理remark列的数据,将用户指定的"\n"字符替换为chr(10),即标准换行符,创建控制文件如下: LOAD DATA INFILE 'D:\testSqlLoader\ldr_

iOS:详解MJRefresh刷新加载更多数据的第三方库

原文链接:http://www.ios122.com/2015/08/mjrefresh/ 简介 MJRefresh这个第三方库是李明杰老师的杰作,这个框架帮助我们程序员减轻了超级多的麻烦,节约了开发时间,提高了开发效率.由于目前能力有限,尚不能自己写一套框架,所以就先膜拜和看明白大牛的框架了. 用于为应用添加常用的上拉加载更多与下拉刷新效果,适用 UIScrollView . UITableView . UICollectionView . UIWebView. gtihub上的地址:http

ASIHttpRequest加载网络数据和上传数据功能

使用ASIHttpRequest第三库,需要配置 二, 上传数据功能使用ASIFromDataRequest(可以上传二进制和字符串给服务器) 下面来牛刀小试 //建立一个工程,导入第三方库,在AppDelegate.h #import <UIKit/UIKit.h> #import "ASIFormDataRequest.h" @interface AppDelegate : UIResponder <UIApplicationDelegate,ASIHTTPReq

数字图像处理 CImage类的使用与封装(jpg png gif tif bmp等格式图像的加载、数据读写、保存等功能)

引入CImage类的原因 原有的CBitmap 类只能处理BMP格式的图片,非常受限.而CImage可以处理JPGE.GIF.BMP.PNG等多种格式图片,扩展了图片处理功能且能与CBitmap 进行转换( 因为所载入的位图句柄都是HBITMAP,所以可相互转换),因此引入CImage类进行图像处理. CImage类简介 CImage是MFC和ATL共享的新类,它能从外部磁盘中调入一个JPEG.GIF.BMP和PNG格式的图像文件加以显示,而且这些文件格式可以相互转换. CImage提供增强型的

Ajax在jQuery中的应用(加载异步数据、请求服务器数据)

加载异步数据 jQuery中的load()方法 load(url,[data],[callback]) url:被加载的页面地址 [data]:可选项表示发送到服务器的数据,其格式为 key/value . [callback]:可选项表示加载成功后,返回至加载页的回调函数. 全局函数 getJSON() $.getJSON(url,[data],[callback]) <div class="container col-lg-12"> <div style=&quo

ASP.NET仿新浪微博下拉加载更多数据瀑布流效果

闲来无事,琢磨着写点东西.貌似页面下拉加载数据,瀑布流的效果很火,各个网站都能见到各式各样的展示效果,原理大同小异.于是乎,决定自己写一写这个效果,希望能给比我还菜的菜鸟们一点参考价值. 在开始之前,先把实现的基本原理说一下.当夜幕下拉到底部的时候,js可以判断滚动条的位置,到达底部触发js方法,执行jquery的ajax方法,向后台一般处理程序夜幕ashx文件请求数据源,得到json格式的数据源.然后,遍历json数据源,拼接一个li标签,再填充到页面上去. 首先,我们来做个简单的html页面

Spring:启动项目时加载数据库数据(总结)

在项目中需要启动程序时,要将数据库的用户信息表加载到内存中,找到一下几种方式. 1.实现ApplicationListener接口,重写onApplicationEvent方法,可以在项目启动的时候执行该方法. @Component("userInit") public class UserInit implements ApplicationListener { public static Map<String,User> map=new HashMap<Strin