今天看CAB相关的技术资料,看到CAB的示例中用到了XSD文件来配置对象的序列化和反序列化,觉得这个定义XML数据类型描述有点复杂,静下心来看了下,觉得配置还是比较方便的。
下面是自己的一点学习笔记。
XML Schema 支持数据类型
XML Schema 最重要的能力之一就是对数据类型的支持。
通过对数据类型的支持:
- 可更容易地描述允许的文档内容
- 可更容易地验证数据的正确性
- 可更容易地与来自数据库的数据一并工作
- 可更容易地定义数据约束(data facets)
- 可更容易地定义数据模型(或称数据格式)
- 可更容易地在不同的数据类型间转换数据
在XSD中首先要了解XML文档中命名空间的概念,其实也就与我们C#代码中的命名空间概念完全显示,主要是为了避免命名空间的重复。如下面示例代码:
2 elementFormDefault = " qualified " xmlns = " http://schemas.microsoft.com/pag/cab-command-map "
3 xmlns:mstns = " http://schemas.microsoft.com/pag/cab-command-map "
4 xmlns:xs = " http://www.w3.org/2001/XMLSchema " >
如上所示是我代码中的XSD中的配置文件的头,其中id说明主键了,这个没什么好说的; targetNamespace说明目标命名空间名称,后面的这个字符串其实就是个别名,没什么;xmlns 就是XML的命名空间名称;xmlns:xs给命名空间定义一个别名;
2 < xs:sequence >
3 < xs:element name = " Mapping " type = " Mapping " minOccurs = " 0 " maxOccurs = " unbounded " />
4 </ xs:sequence >
5 </ xs:complexType >
6 < xs:complexType name = " Mapping " >
7 < xs:attribute name = " Site " type = " xs:string " />
8 < xs:attribute name = " CommandName " type = " xs:string " />
9 < xs:attribute name = " Label " type = " xs:string " />
10 </ xs:complexType >
11 < xs:element name = " CommandMap " type = " CommandMap " />
在下面定义了两种复合数据类型,CommandMap 与 Mapping两种数据类型,前一种数据类型中sequence 说明这个数据类中对象的先后顺序,下面定义用到了属性和元素的概念,在最后我们把此类型兑现中定义了一个CommandMap数据成员,说明对应的XML实体对象对应有个CommandMap成员,其它的关于XML属性和元素相关定义和说明可以查看对应的帮助文档http://www.w3school.com.cn/schema/schema_schema.asp。
下面应用对应的XDS文档类实体对象成员和对应XML标记文档实现,如下代码所示:
2 [System.SerializableAttribute()]
3 [System.Xml.Serialization.XmlTypeAttribute(Namespace = " http://schemas.microsoft.com/pag/cab-command-map " )]
4 [System.Xml.Serialization.XmlRootAttribute(Namespace = " http://schemas.microsoft.com/pag/cab-command-map " , IsNullable = false )]
5 public partial class CommandMap
6 {
7
8 private Mapping[] mappingField;
9
10 /// <remarks/>
11 [System.Xml.Serialization.XmlElementAttribute( " Mapping " )]
12 public Mapping[] Mapping
13 {
14 get
15 {
16 return this .mappingField;
17 }
18 set
19 {
20 this .mappingField = value;
21 }
22 }
23 }
24
25 /// <remarks/>
26 [System.SerializableAttribute()]
27 [System.Xml.Serialization.XmlTypeAttribute(Namespace = " http://schemas.microsoft.com/pag/cab-command-map " )]
28 public partial class Mapping
29 {
30
31 private string siteField;
32
33 private string commandNameField;
34
35 private string labelField;
36
37 /// <remarks/>
38 [System.Xml.Serialization.XmlAttributeAttribute()]
39 public string Site
40 {
41 get
42 {
43 return this .siteField;
44 }
45 set
46 {
47 this .siteField = value;
48 }
49 }
50
51 /// <remarks/>
52 [System.Xml.Serialization.XmlAttributeAttribute()]
53 public string CommandName
54 {
55 get
56 {
57 return this .commandNameField;
58 }
59 set
60 {
61 this .commandNameField = value;
62 }
63 }
64
65 /// <remarks/>
66 [System.Xml.Serialization.XmlAttributeAttribute()]
67 public string Label
68 {
69 get
70 {
71 return this .labelField;
72 }
73 set
74 {
75 this .labelField = value;
76 }
77 }
78 }
上面的类实体定义中用到了XML标签说明,说明了对象在序列化和反序列化具体序列化的对象和类型;
2 < CommandMap xmlns = " http://schemas.microsoft.com/pag/cab-command-map " >
3 < Mapping Site = " File " Label = " Show Customer " CommandName = " ShowCustomer " />
4 < Mapping Site = " File " Label = " Disable Show Customer " CommandName = " DisableShowCustomer " />
5 < Mapping Site = " File " Label = " Enable Show Customer " CommandName = " EnableShowCustomer " />
6 < Mapping Site = " File " Label = " Hide Show Customer " CommandName = " HideShowCustomer " />
7 </ CommandMap >
定义XDS的消费方式和类型,下面是具体的调用方式:
using (Stream stream = new FileStream( " SampleCommandMap.xml " , FileMode.Open, FileAccess.Read))
{
XmlSerializer serializer = new XmlSerializer( typeof (CommandMap));
map = (CommandMap)serializer.Deserialize(stream);
}
写的比较匆忙,希望各位看客多提宝贵意见,对XSD文件的使用范围和方式在不同领域的应用大家都可以讨论下。