方法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.运行结果
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