今天看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文件的使用范围和方式在不同领域的应用大家都可以讨论下。