对DataSet.ReadXml方法的一个实验

方法DataSet.ReadXml可以将一个XML文档的内容读入到DataSet中,今天我写了段代码测试了下这个函数到底是怎么读入XML文档中的数据的。从这个方法对应的MSDN页面中可以看到它有多个重载,不过读取方式都是一样的。本文测试的是这个重载:DataSet.ReadXml (TextReader) ,类StreamReader继承自类TextReader

MSDN页面:http://msdn.microsoft.com/zh-cn/library/system.data.dataset.readxml%28VS.80%29.aspx

通过DataSet.ReadXml可以将一个XML的部分内容和全部结构存储到一个DataSet中

1.示例XML

建立一个XML文档test.xml

<?xml version="1.0" encoding="UTF-8"?>
<A id="a1" a12="a12" a23="a23">
  <BX id="b1" b12="b12" b23="b23" b34="b34" />
  <BX id="b2" b23="b23" b34="b34" b45="b45">
    <C id="c1" c12="c12" c23="c23"/>
    <C id="c2" c23="c23" c34="c34"/>
  </BX>
  <BY id="b3" b34="b34" b45="b45" b56="b56">
    <C id="c3" c34="c34" c45="c45" >This is a test XML</C>
    <C id="c4" c45="c45" c56="c56">
      <D id="d1" d12="d12" d23="d23" d34="d34" d45="d45"/>  
    </C>
  </BY>
</A>

2.测试代码

下面这段C#代码用来把这个XML读取到DataSet中并打印出来

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

//需要新增的命名空间
using System.Data;
using System.IO;

namespace TestProgram
{
    class Program
    {
        /// <summary>
        /// 打印一个DataSet中的内容
        /// </summary>
        /// <param name="ds"></param>
        public static void PrintDataSet(DataSet ds)
        {
            Console.WriteLine("---------------");
            Console.WriteLine("DataSetName: {0}", ds.DataSetName);
            for (int i = 0; i < ds.Tables.Count; i++)
            {
                Console.WriteLine("---------------");
                Console.WriteLine("TableNumber: {0}", i);
                Console.WriteLine("---------------");
                PrintDataTable(ds.Tables[i]);
            }
            Console.WriteLine("---------------");
        }

        /// <summary>
        /// 打印一个DataTable中的内容
        /// </summary>
        /// <param name="dt"></param>
        public static void PrintDataTable(DataTable dt)
        {
            Console.WriteLine("DataTableName: {0}", dt.TableName);
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                Console.Write(dt.Columns[i].ColumnName + "\t");
            }
            Console.WriteLine();
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    Console.Write(dt.Rows[i][j] + "\t");
                }
                Console.WriteLine();
            }
        }

        static void Main(string[] args)
        {
            using (StreamReader sr = new StreamReader(@"test.xml", Encoding.UTF8))
            {
                DataSet ds = new DataSet();
                ds.ReadXml(sr);
                PrintDataSet(ds);
            }

            Console.ReadLine();
        }
    }
}

3.运行结果

对DataSet.ReadXml方法的一个实验_第1张图片

4.发现的规律总结

1)每遇到一个新的XML元素(element)名,都会在DataSet中建立一个新的DataTable。这个DataTable的列名如下:第0列为该元素名的ID,列名为“元素名_Id”(按在XML中出现的顺序,从0开始累加),第1到n列为该元素的各个属性(attribute)(n为该元素的属性数量),第n+1列存放该元素父节点的ID,该列列名即该元素父节点的“元素名_Id”(若该元素是跟元素则无此列)

2)每遇到一个之前遇到过的元素名,它会以一行的形式加入到为该元素建立的DataTable中,对于这个元素来说,如果它的一个属性在DataTable中已经存在了,则加入到对应的列,如果不存在,DataTable会增加新的列来对应这些属性。如果这个元素的父节点元素名与DataTable已有元素相同,则在其对应列写下它父节点的ID,否则新建一列,列名为“父节点元素名_Id”

3)用这个方法读取XML时,不会读取元素的值,只会读取结构和属性的值

END

你可能感兴趣的:(DataSet.ReadXml)