Dataset利用xsd读取xml,数值类型处理及验证
时间:2011-05-10 来源:arg
应该会有很多场景需要从xml文件读取数据,填充一个dataset。机器上没装数据库,个人觉得最好简便方法就是定义一个xml文件,模拟数据。默认,xml在datatable中的值都是字符串类型(Excel中输入数字,就知道是数值型)。如果需要dataset在调用readxml方法的时候,把是什么类型(比如xml中本意是整型,时间类型)自动转换成什么类型方便,这才能像是从数据库中读出来的数据集。不幸的是,xml本身不会说明自己的值类型。xsd文件能说明它的结构。从dataset的readxml,以及readscheme方法来看,不作它议的该从这两个方法入手,搭配xsd,读取xml。本来想Google到例子,几个关键词下去,没找到十全的例子。最多抱怨的是说,手写xsd太难。
后面打算傻傻的用xsd数据集算了,转而想到,做个对应
的Xsd应该可以当做这个xml的架构文件。自己用vs添加一个xsd,和xml对应起来,然后把它当做xml文件的结构说明文件,成功把类型按xsd设置,自动转换过来了。相信用vs写xsd不难吧,简直太容易。最后再去Google的时候,才明白,vs也是又工具生成xml的架构文件的。在vs 2008里面,打开xml,在IDE的菜单,会多出一个xml菜单。下拉看到生成架构就对了,然后手工去改那默认的数据类型.
总结起来的关键点是:
1,vs 会以一个dataset的单位来生成一个xsd文件,不管它, 也不用理会这个dataset叫什么名字(一般也是xsd的名字)
2,xsd和xml文件中的表节点名字对应起来,各自的字段名字对应起来,字段的顺序可以不一样,但是字段个数应该是
xsd大于等于xml(这里先不管验证xml的合法性,只管数据转换)。
3,调用xmlread的时候,XmlReadMode参数设置为XmlReadMode.InferTypedSchema;
代码如下
DataSet ds = new DataSet();
ds.ReadXmlSchema(Server.MapPath("~/App_Code/DataSet1.xsd"));
ds.ReadXml(Server.MapPath("Data.xml"), XmlReadMode.InferTypedSchema);
附使用xsd验证xml文档的代码,载自msdn(不再说明如何生成xsd)
xsd架构添加到 XmlReaderSettings 对象的 XmlSchemaSet Schemas 属性中。XmlReaderSettings 对象作为参数传递给需要验证的 XML 文档的 XmlReader 对象的 Create 方法。
XmlReaderSettings 对象的 ValidationType 属性设置为 Schema,强制通过 XmlReader 对象的 Create 方法验证 XML 文档。ValidationEventHander 添加到 XmlReaderSettings 对象中,以处理 XML 文档和架构的验证过程中发现的错误所引发的任何 Warning 或 Error 事件。
using System;
using System.Xml;
using System.Xml.Schema;
class XmlSchemaSetExample
{
static void Main()
{
XmlReaderSettings booksSettings = new XmlReaderSettings();
booksSettings.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd");
booksSettings.ValidationType = ValidationType.Schema;
booksSettings.ValidationEventHandler += new ValidationEventHandler(booksSettingsValidationEventHandler);
XmlReader books = XmlReader.Create("contosoBooks.xml", booksSettings);
while (books.Read()) { }
}
static void booksSettingsValidationEventHandler(object sender, ValidationEventArgs e)
{
if (e.Severity == XmlSeverityType.Warning)
{
Console.Write("WARNING: ");
Console.WriteLine(e.Message);
}
else if (e.Severity == XmlSeverityType.Error)
{
Console.Write("ERROR: ");
Console.WriteLine(e.Message);
}
}
}