• Dataset利用xsd读取xml,数值类型处理及验证


    应该会有很多场景需要从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);
            }
        }
    }


       

  • 相关阅读:
    窗体的扩展样式GWL_EXSTYLE用于SetWindowLong
    内存映射对于大文件的使用
    Delphi实现全局鼠标钩子
    全局键盘钩子(WH_KEYBOARD)
    实现拦截API的钩子(Hook)
    JBoss + EJB3 + MySql : 开发第一个EJB
    取PE文件的引入表和导出表
    Webbrowser中模拟连接点击(非鼠标模拟)
    打造无DLL版穿透防火墙Downloader
    Delphi 常用属性+方法+事件+代码+函数
  • 原文地址:https://www.cnblogs.com/wusong/p/2042454.html
Copyright © 2020-2023  润新知