注意这里使用的是c# 2.0来实现的,相比1.1必须通过实现IConfigurationSectionHandler接口来自定义配置节点类方便多了
不论是web.config还是app.config,都可以使用ConfigurationManager类加载配置文件中自定义的节点内容。
以下是配置文件的层次结构:
1
<?xml version="1.0" encoding="utf-8" ?>
2
<configuration>
3
<configSections>
4
<section name="orders" type="ConsoleTest.OrdersSection, ConsoleTest"/>
5
</configSections>
6
<orders companyID="2001">
7
<order number="100001" amount="222.22">
8
<lineItems warehouseNumber="02">
9
<lineItem number="00-000-001" description="wii"/>
10
</lineItems>
11
</order>
12
<order number="300001" amount="33.33">
13
<lineItems warehouseNumber="99">
14
<lineItem number="00-000-001" description="xbox 360"/>
15
<lineItem number="00-000-003" description="playstation 3"/>
16
</lineItems>
17
</order>
18
</orders>
19
</configuration>

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

注意order和lineItem节点都是允许重复出现的
以下是继承自ConfigurationSection的自定义配置节点类:
1
public class OrdersSection : ConfigurationSection
2
{
3
[ConfigurationProperty("companyID", IsRequired = true)]
4
public string CompanyID
5
{
6
get
7
{
8
return (string)base["companyID"];
9
}
10
set
11
{
12
base["companyID"] = value;
13
}
14
}
15
16
[ConfigurationProperty("", IsDefaultCollection = true)]
17
public OrderElementCollection Orders
18
{
19
get
20
{
21
return (OrderElementCollection)base[""];
22
}
23
}
24
}
25
26
public class OrderElementCollection : ConfigurationElementCollection
27
{
28
protected override ConfigurationElement CreateNewElement()
29
{
30
return new OrderElement();
31
}
32
protected override object GetElementKey(ConfigurationElement element)
33
{
34
return ((OrderElement)element).Number;
35
}
36
37
public override ConfigurationElementCollectionType CollectionType
38
{
39
get
40
{
41
return ConfigurationElementCollectionType.BasicMap;
42
}
43
}
44
protected override string ElementName
45
{
46
get
47
{
48
return "order";
49
}
50
}
51
52
public OrderElement this[int index]
53
{
54
get
55
{
56
return (OrderElement)BaseGet(index);
57
}
58
set
59
{
60
if (BaseGet(index) != null)
61
{
62
BaseRemoveAt(index);
63
}
64
BaseAdd(index, value);
65
}
66
}
67
}
68
69
public class OrderElement : ConfigurationElement
70
{
71
[ConfigurationProperty("number", IsRequired = true)]
72
public string Number
73
{
74
get
75
{
76
return (string)base["number"];
77
}
78
set
79
{
80
base["number"] = value;
81
}
82
}
83
84
[ConfigurationProperty("amount", IsRequired = true)]
85
public double Amount
86
{
87
get
88
{
89
return (double)base["amount"];
90
}
91
set
92
{
93
base["amount"] = value;
94
}
95
}
96
97
[ConfigurationProperty("lineItems", IsDefaultCollection = true)]
98
public LineItemElementCollection LineItems
99
{
100
get
101
{
102
return (LineItemElementCollection)base["lineItems"];
103
}
104
}
105
}
106
107
public class LineItemElementCollection : ConfigurationElementCollection
108
{
109
[ConfigurationProperty("warehouseNumber", IsRequired = true)]
110
public string WarehouseNumber
111
{
112
get
113
{
114
return (string)base["warehouseNumber"];
115
}
116
set
117
{
118
base["warehouseNumber"] = value;
119
}
120
}
121
122
protected override ConfigurationElement CreateNewElement()
123
{
124
return new LineItemElement();
125
}
126
protected override object GetElementKey(ConfigurationElement element)
127
{
128
return ( (LineItemElement)element ).Number;
129
}
130
131
public override ConfigurationElementCollectionType CollectionType
132
{
133
get
134
{
135
return ConfigurationElementCollectionType.BasicMap;
136
}
137
}
138
protected override string ElementName
139
{
140
get
141
{
142
return "lineItem";
143
}
144
}
145
146
public LineItemElement this[int index]
147
{
148
get
149
{
150
return (LineItemElement)BaseGet(index);
151
}
152
set
153
{
154
if (BaseGet(index) != null)
155
{
156
BaseRemoveAt(index);
157
}
158
BaseAdd(index, value);
159
}
160
}
161
}
162
163
public class LineItemElement : ConfigurationElement
164
{
165
[ConfigurationProperty("number", IsKey=true, IsRequired = true)]
166
public string Number
167
{
168
get
169
{
170
return (string)base["number"];
171
}
172
set
173
{
174
base["number"] = value;
175
}
176
}
177
178
[ConfigurationProperty("description", IsRequired = true)]
179
public string Description
180
{
181
get
182
{
183
return (string)base["description"];
184
}
185
set
186
{
187
base["description"] = value;
188
}
189
}
190
}

2



3

4

5



6

7



8

9

10

11



12

13

14

15

16

17

18



19

20



21

22

23

24

25

26

27



28

29



30

31

32

33



34

35

36

37

38



39

40



41

42

43

44

45



46

47



48

49

50

51

52

53



54

55



56

57

58

59



60

61



62

63

64

65

66

67

68

69

70



71

72

73



74

75



76

77

78

79



80

81

82

83

84

85

86



87

88



89

90

91

92



93

94

95

96

97

98

99



100

101



102

103

104

105

106

107

108



109

110

111



112

113



114

115

116

117



118

119

120

121

122

123



124

125

126

127



128

129

130

131

132



133

134



135

136

137

138

139



140

141



142

143

144

145

146

147



148

149



150

151

152

153



154

155



156

157

158

159

160

161

162

163

164



165

166

167



168

169



170

171

172

173



174

175

176

177

178

179

180



181

182



183

184

185

186



187

188

189

190
