XmlAttribute与实体的转换和匹配方案
- 时间:2015年04月02日 15:32:49 来源:魔法猪系统重装大师官网 人气:2557
一、前言
可扩展标记语言 (XML) 是具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML是用来存储数据的,重在数据本身。本文中的代码是几个月前整理的,最近几个月的时间很少写随笔,除了工作以外,主要还是忙于整理自己的框架。这篇随笔主要是针对于XML的特性Attribute与实体之间的匹配与转换,其中的内容包括反射、XML以及LinqToXml,代码的内容也是想到什么就写什么,纯属练习下手感,仅供参考。下一篇随笔将以另外的形式来转换Xml为对象实体,当然,也是以反射为主,和本随笔中的思路差不多,主要是XML的格式和解决方案不同而已。对于如何将对象转换成Xml的话,主要还是看情况,仅仅转换简单的对象的话,直接反射就可以生成。对于复杂的对象的话,可以采用dynamic,树结构和递归算法的方案来定制XML。
二、类图设计
该处的主要思路为:通过反射将与类名(类特性名称或者类名)的节点匹配,然后匹配属性(属性特性名称或者属性名称)值。反之,则遍历实体对象的属性,设置相应的XML。本来还想细化一下匹配与转换操作的,但是该类的EA文件不知道放在哪里了,只有设计的截图还在,XO。相关类图设计如下:
PropertyAttribute主要设置属性的特性名称,用于转换过程设置属性的别名,同时匹配过程中匹配XML的特性与属性的名称。
ClassAttribute主要设置类的特性名称,用于转换过程设置类的别名,同时匹配过程中匹配XML的节点与类的名称。
StringExtension主要是字符串的扩展方法。
FuncDictionary主要转换字符串为特定类型的值。
XmlAttributeUtility主要转换实体对象为XML以及匹配XML为实体对象,其中还包括一些其他基本操作。
三、具体实现
先看下FuncDictionary,该类主要通过异步委托将字符串转换成相应的简单类型,所有实现围绕该类进行相关操作。FuncDictionary基本涵盖了C#中的所有简单类型,可以将字符串转换成这些简单类型。
主要方法为:public object DynamicInvoke(Type type, string arg),通过传入的类型和字符串值,可以转换成相应的Object值。属性Dictionary中涵盖了所有简单类型转换的委托操作。代码如下:
1 public class FuncDictionary
2 {
3 public static IDictionary
4 {
5 get;
6 private set;
7 }
8
9 static FuncDictionary()
10 {
11 if (FuncDictionary.Dictionary == null)
12 {
13 FuncDictionary.Dictionary = CreateDictionary();
14 }
15 }
16
17 public object DynamicInvoke(Type type, string arg)
18 {
19 if (type == null)
20 {
21 return null;
22 }
23
24 if (FuncDictionary.Dictionary == null)
25 {
26 FuncDictionary.Dictionary = CreateDictionary();
27 }
28
29 if (!FuncDictionary.Dictionary.ContainsKey(type))
30 {
31 return null;
32 }
33
34 Delegate action = FuncDictionary.Dictionary[type];
35
36 return action.DynamicInvoke(new object[] { arg });
37 }
38
39 public static IDictionary
40 {
41 var dictionary = new Dictionary
42
43 dictionary.Add(typeof(string), new Func
44 dictionary.Add(typeof(decimal), new Func
45 dictionary.Add(typeof(DateTime), new Func
46 dictionary.Add(typeof(float), new Func
47 dictionary.Add(typeof(double), new Func
48 dictionary.Add(typeof(int), new Func
49 dictionary.Add(typeof(byte), new Func
50 dictionary.Add(typeof(sbyte), new Func
51 dictionary.Add(typeof(short), new Func
52 dictionary.Add(typeof(ushort), new Func
53 dictionary.Add(typeof(uint), new Func
54 dictionary.Add(typeof(long), new Func
55 dictionary.Add(typeof(ulong), new Func
56 dictionary.Add(typeof(char), new Func
57 dictionary.Add(typeof(bool), new Func
58 dictionary.Add(typeof(Color), new Func
59
60 return dictionary;
61 }
62 }
再看下XmlAttributeUtility类,该类主要包括转换和匹配操作。匹配主要为两种方案(主要逻辑为以下代码的72-183行):
1、通过XmlReader顺序读取来设置实体的值,主要方法为public static IList
2、通过遍历XmlNodeList中的节点,依次遍历节点中的XmlAttribute设置实体的属性的值,主要方法为:public static IList
XmlAttributeUtility的转换操作相对来说比较简单,采用反射+LinqToXml转换操作就很简单了,主要实现方法为public static XElement Convert
四、单元测试
FuncDictionary的单元测试必须涵盖所有类型的测试才能将代码覆盖率达到100%,此处只针对DateTime做正常测试、异常测试和空值测试(当然,对于其他类型的方法,可能还需要做脚本测试,SQL注入测试等,这三种类型的测试是最基本的测试),其他代码的单元测试详细见源代码,也仅仅只做了些基本的测试,写测试比写代码费哥的时间.
五、总结
以上的代码仅仅是当时想着怎么实现就怎么写的,完全是随意而写。仅供参考,实战没有多大意义,纯粹练习下灵感和手感,增强对技术的敏感性而已,纯属娱乐。对于
今天也是2011年最后一天,明天就是2012年了,在此恭祝大家2012元旦快乐,新一年,日子顺心多平安;新一年,祝福多多又暖暖;新一年,愿望件件都圆满;新一年,幸福快乐早实现;新一年,元旦祝福围身边;玛雅终结之年到了,所以,为了拯救人类,一定要快乐哦!
源码下载:XmlAttribute转换和匹配源代码





