方法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