XSD 序列化 与 反序列化

 

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

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

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

1. 首先在VS2005中添加一个XSD文件。

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. 如何由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);
}
}

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

- 代码中验证:
Validate XML against XSDValidate XML against XSD#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值