今天看CAB相关的技术资料,看到CAB的示例中用到了XSD文件来配置对象的序列化和反序列化,觉得这个定义XML数据类型描述有点复杂,静下心来看了下,觉得配置还是比较方便的。

     下面是自己的一点学习笔记。

  XML Schema 支持数据类型

  XML Schema 最重要的能力之一就是对数据类型的支持。

  通过对数据类型的支持:

  • 可更容易地描述允许的文档内容
  • 可更容易地验证数据的正确性
  • 可更容易地与来自数据库的数据一并工作
  • 可更容易地定义数据约束(data facets)
  • 可更容易地定义数据模型(或称数据格式)
  • 可更容易地在不同的数据类型间转换数据

     在XSD中首先要了解XML文档中命名空间的概念,其实也就与我们C#代码中的命名空间概念完全显示,主要是为了避免命名空间的重复。如下面示例代码:

 

代码
1 <xs:schema id="CommandMap" targetNamespace="http://schemas.microsoft.com/pag/cab-command-map"
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给命名空间定义一个别名;

 

代码
 1 <xs:complexType name="CommandMap">
 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标记文档实现,如下代码所示:

 

 1  /// <remarks/>
 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标签说明,说明了对象在序列化和反序列化具体序列化的对象和类型;

 

1 <?xml version="1.0" encoding="utf-8" ?>
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的消费方式和类型,下面是具体的调用方式:

 

代码
  CommandMap map;
            
using (Stream stream = new FileStream("SampleCommandMap.xml", FileMode.Open, FileAccess.Read))
            {
                XmlSerializer serializer 
= new XmlSerializer(typeof(CommandMap));
                map 
= (CommandMap)serializer.Deserialize(stream);
            }

 

  写的比较匆忙,希望各位看客多提宝贵意见,对XSD文件的使用范围和方式在不同领域的应用大家都可以讨论下。 

posted on 2010-05-24 22:29  老A  阅读(582)  评论(0编辑  收藏  举报