项目中有时候要用XML作为数据源,因此需要定义XML文件和相应的类,最佳方法是首先定义XSD,然后自动生成实体类,最后生成XML和填充数据;读取XML数据源的时候,首先用XSD验证XML数据格式,然后自动读入实体类使用。

定义XSD的过程就是类似设计表结构的过程,二者也可以相互转化。

本文讨论了如何定义XSD文件(XML Schema),然后自动生成实体类,最后生成XML的过程,以及如何根据XSD验证XML文件的合法性。以供大家做项目时参考。

1. 首先在VS2005中添加一个XSD文件。例子XSD可以参考:

http://www.15seconds.com/issue/031209.htm

http://www.cduce.org/manual_schema_samples.html

2. 使用VS2005工具XSD.exe(SDK\v2.0\Bin\xsd.exe)自动生成实体类:

xsd /c /namespace:myCompany /language:CS temp1.xsd

也可以生成DataSet类型的类:

xsd /dataset /language:CS temp1.xsd

( 类文件和XSD之间可以相互转换,也就是说,你也可以先生成类,然后自动生成XSD)

自动读取XML数据到实体类:

XmlSerializer xs = new XmlSerializer(typeof(myClassType));
using (FileStream fs = new FileStream(XmlFilePath, FileMode.Open))
{
    return (myClassType)xs.Deserialize(fs);
}

3. 如何由XML生成XSD?

- 可以用工具,如XMLSpy,首先打开XML, 然后DTD/Schema -> Generate DTD/Schema, 选择W3c Sehcma即可。

- 此方法不一定能生成确切满足需求的XSD,另需修改。

4. 如何由XSD生成XML?

- 可以用其他工具,如XMLSpy,DTD/Schema -> Generate sample XML file...
  
   - 可以由XSD生成类,然后写代码实例化这个类,最后序列化为XML

- 如何自动给类每个属性设置一个空值:(用反射的方法)

代码示例:

/// <summary>
        /// Get all properties and set default value
        /// </summary>
        /// <typeparam name="T">Type</typeparam>
        /// <param name="item">Object</param>
        private static void ReflctProperties<T>(T item)
        {
            PropertyInfo[] pty = typeof(T).GetProperties();
            Type t = item.GetType();

if (pty != null)
            {
                foreach (PropertyInfo info in pty)
                {
                    if (!info.CanWrite) continue;

if (info.PropertyType == typeof(String))
                    {
                        t.GetProperty(info.Name).SetValue(item, String.Empty, null);
                    }
                    if (info.PropertyType == typeof(Boolean))
                    {
                        t.GetProperty(info.Name).SetValue(item, true, null);
                    }
                }
            }
        }

- 反射读取类的属性:

public static object GetProperty<T>(T item, string PropertyName)
{
     PropertyInfo propertyInfo = item.GetType().GetProperty(PropertyName);
     if (propertyInfo != null)
     {                
         return propertyInfo.GetValue(item, null);
     }
     return null;
}

- 如何序列化为XML?

/// <summary>
        /// Serialize class instance to XML file
        /// </summary>
        /// <typeparam name="T">type</typeparam>
        /// <param name="XMLFileToCreate">XMLFileToCreate</param>
        /// <param name="instance">class instance</param>
        public void Serialize<T>(string XMLFileToCreate, T instance)
        {
            if (instance == null) return;

XmlSerializer xs = new XmlSerializer(typeof(T));
            using (StreamWriter sw = new StreamWriter(XMLFileToCreate))
            {
                xs.Serialize(sw, instance);
            }
        }

(Link: 使用XMLSerializer类持久化数据 )

5. 如何使用XSD来验证XML文件合法性:
   
   - 使用XMLSpy,首先Assign XSD,然后验证 (其实就是设置XML里面引用的schema,注意schema可能引用其他的schema)
  
   - 代码中验证:

    #region Validate XML against XSD

public class Validator
    {
        private string errMsg;

/// <summary>
        /// validation Error Msg
        /// </summary>
        public string validationErrMsg
        {
            get { return errMsg; }
            set { errMsg = value; }
        }
        
       
        /// <summary>
        /// Validate XML against schema
        /// </summary>
        /// <param name="XSD"></param>
        /// <param name="XMLFile"></param>
        /// <param name="LocationDefined"></param>
        /// <returns></returns>
        public bool Validate(string XSD, string XMLFile, bool LocationDefined)
        {
            bool isValid = true;

try
            {
                Stream schemaFile = null;

XmlReaderSettings settings = new XmlReaderSettings();
                ValidationEventHandler SchemaValidationEventHandler = new ValidationEventHandler(ValidationCallBack);

settings.ValidationType = ValidationType.Schema;
                settings.ValidationFlags |= XmlSchemaValidationFlags.AllowXmlAttributes;
                settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
                settings.ValidationEventHandler += SchemaValidationEventHandler;

if (LocationDefined == true)
                {
                    settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
                    settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
                }
                else
                {
                    schemaFile = new FileStream(XSD, FileMode.Open);
                    
                    XmlSchema tmsSchema = XmlSchema.Read(schemaFile, SchemaValidationEventHandler);

settings.Schemas.Add(tmsSchema);
                }

using (XmlReader reader = XmlReader.Create(XMLFile, settings))
                {
                    string test;

while (reader.Read() && isValid == true)
                    {
                        test = reader.Name;
                    }
                };

if (schemaFile != null)
                {
                    schemaFile.Close();
                }
            }
            catch (Exception e)
            {
                validationErrMsg += "Exception occured when validating. " + e.Message;

isValid = false;
            }

return isValid;
        }

/// <summary>
        /// Display any warnings or errors.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        public void ValidationCallBack(object sender, ValidationEventArgs args)
        {
            if (args.Severity == XmlSeverityType.Warning)
            {
                validationErrMsg += "Matching schema not found. No validation occurred." + args.Message;
                validationErrMsg = args.Message;
            }
            else
            {
                validationErrMsg += "\nValidation error: " + args.Message;

validationErrMsg = args.Message;
            }
        }
    }
    #endregion

 
 
原文链接:http://www.cnblogs.com/Mainz/archive/2007/12/16/996857.html

如何由XSD自动生成XML和实体类的更多相关文章

  1. 让Visual Studio 2013为你自动生成XML反序列化的类

    Visual Sutdio 2013增加了许多新功能,其中很多都直接提高了对代码编辑的便利性.如: 1. 在代码编辑界面的右侧滚动条上显示不同颜色的标签,让开发人员可以对所编辑文档的修改.查找.定位情 ...

  2. 自动生成XML反序列化的类

    原文地址:http://www.cnblogs.com/jaxu/p/3632077.html   Visual Sutdio 2013增加了许多新功能,其中很多都直接提高了对代码编辑的便利性.如: ...

  3. XSD文件生成C#VO实体类

    最近公司要做一个项目,需要和现有的其他项目对接,由于不知道他们的数据库,只有XSD文件.所以,我们在修改相应的程序时,就需要根据他们提供的XSD文件,来写我们的VO实体类,由于我写过根据Oracle数 ...

  4. 使用generatorConfig工具自动生成mybatis的实体类以及dao接口和映射文件

    1:数据准备 创建一个数据库表 CREATE TABLE `logininfo` ( `id` ) NOT NULL AUTO_INCREMENT, `username` ) DEFAULT NULL ...

  5. Java工具类_表结构自动生成对应的实体类、Mapper.xml文件、Dao类

    import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWrit ...

  6. mybatis-generator 自动生成mapper以及实体类

    研究了一下,感觉也不是特别方便,因为参数很多都是需要手动去配置的,如果在这个jar基础上在改造一下或许更方便一点. 具体实现代码如下: pom.xml <plugin> <group ...

  7. T4自动生成数据库C#实体类学习(1)

    第一个测试的Demo <#@ template language="C#" debug="True" hostspecific="True&qu ...

  8. Mybatis自动生成xml文件、dao接口、实体类

    Mybatis可以通过逆向工程,实现自动生成xml文件.dao接口.实体类 以下使用的是Intellij Idea进行自动生成 一.首先,要在pom.xml中导入插件,在<build>中加 ...

  9. 利用MyEclipse连接数据库并自动生成基于注解或者XML的实体类

    一.利用MyEclipse连接数据库 1. 打开MyEclipse的数据库连接视图 然后在Other中找到"MyEclipse Database"中的DB Browser 2. 在 ...

随机推荐

  1. javascript——面向对象程序设计(3)

    <script type="text/javascript"> //1.结合使用构造函数模式和原型模式 //2.动态原型模式 //3.寄生构造函数模式 //4.稳妥构造 ...

  2. python使用VBA:Excel创建图表(转)

    # -*- coding: utf-8 -*- """ Created on Thu Mar 06 11:22:03 2014 @author: Administrato ...

  3. 初探grunt.js

    package.js { "name": "ttd_v3", "version": "0.1.0", "aut ...

  4. mysql数据类型——字符串char(m)和varchar(m)

    char(m) 定长字符串类型  非 Unicode 字符 varchar(m) 变长字符串类型  非 Unicode 数据 说明:M为最大可存储字节数 汉子占两个字节,通过指定m,来限制存储的最大字 ...

  5. BAE 环境下配置 struts2 + spring + hibernate(SSH)(三)spring&hibernate

    1.在lib中加入必要的包,导入后结果如下: lib打包下载:SSH-lib.jar  (struts2.3.1.2  spring3.0.5 hibernate3.6.10.Final) 只包含必要 ...

  6. 黑马程序员—C语言的特点和关键字

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- C语言的简介 一. C语言具有下列特点: C语言既具有低级语言直接操纵硬件的特点,又具有高级语言 ...

  7. 阻止文件不被上传到iCloud-b

    有空用下 http://www.cocoachina.com/bbs/read.php?tid=86244 http://www.ooso.net/archives/617 http://blog.c ...

  8. WPF感悟(1)

    原文地址:http://liutiemeng.blog.51cto.com/120361/91632 1.UI层与逻辑层要尽可能地剥离(解耦). 2.Routed Event和Command比Even ...

  9. BZOJ 3572 世界树

    Description 世界树是一棵无比巨大的树,它伸出的枝干构成了整个世界.在这里,生存着各种各样的种族和生灵,他们共同信奉着绝对公正公平的女神艾莉森,在他们的信条里,公平是使世界树能够生生不息.持 ...

  10. [BZOJ 1874] [BeiJing2009 WinterCamp] 取石子游戏 【博弈论 | SG函数】

    题目链接:BZOJ - 1874 题目分析 这个是一种组合游戏,是许多单个SG游戏的和. 就是指,总的游戏由许多单个SG游戏组合而成,每个SG游戏(也就是每一堆石子)之间互不干扰,每次从所有的单个游戏 ...