今天需要解析一個XML,這個XML和一般情況用.NET的序列化出來的格式不太一樣。
我就又補習了一下。
分享一下學習成果吧。
示例代碼下載:
http://download.csdn.net/detail/bdstjk/4028340
使用屬性可以控制對象的 XML 序列化。
默認情況下,XML 元素名稱由類或成員名稱確定。在名為 Book
的簡單類中,字段 ISBN
將生成 XML 元素標記 <ISBN>,如下面的示例所示。
1
public
class
Book
2
{
3
public
string
ISBN;
4
}
5
// When an instance of the Book class is serialized, it might
6
// produce this XML:
7
// <ISBN>1234567890</ISBN>.
若要重新命名元素,可以更改這種默認行為。下面的代碼演示屬性 (Attribute) 如何通過設置 XmlElementAttribute 的 ElementName 屬性 (Property) 實現此目的。
1
public
class
TaxRates{
2
[XmlElement(ElementName =
"TaxRate"
)]
3
public
decimal
ReturnTaxRate;
4
}
XmlArrayAttribute 和 XmlArrayItemAttribute 屬性旨在用於控制數組的序列化。使用這些屬性可以控制元素名稱、命名空間以及 XML 架構 (XSD) 數據類型(在萬維網聯合會 [www.w3.org] 文檔“XML 架構第 2 部分:數據類型”中進行了定義)。此外,還可以指定數組所能包含的類型。
對於序列化數組時生成的封閉 XML 元素,其屬性將由 XmlArrayAttribute 確定。例如,默認情況下,序列化下面的數組時,將會生成名為Employees
的 XML 元素。Employees
元素將包含在數組類型Employee
之後命名的一系列元素。
1
public
class
Group{
2
public
Employee[] Employees;
3
}
4
public
class
Employee{
5
public
string
Name;
6
}
序列化實例可能如下所示。
1
<
Group
>
2
<
Employees
>
3
<
Employee
>
4
<
Name
>Haley</
Name
>
5
</
Employee
>
6
</
Employees
>
7
</
Group
>
通過應用 XmlArrayAttribute,可以按照以下方式更改 XML 元素的名稱。
1
public
class
Group{
2
[XmlArray(
"TeamMembers"
)]
3
public
Employee[] Employees;
4
}
生成的 XML 可能如下所示。
1
<
Group
>
2
<
TeamMembers
>
3
<
Employee
>
4
<
Name
>Haley</
Name
>
5
</
Employee
>
6
</
TeamMembers
>
另一方面,XmlArrayItemAttribute 可以控制如何序列化數組中包含的項。請注意,該屬性將應用於返回數組的字段。
1
public
class
Group{
2
[XmlArrayItem(
"MemberName"
)]
3
public
Employee[] Employees;
4
}
生成的 XML 可能如下所示。
1
<
Group
>
2
<
Employees
>
3
<
MemberName
>Haley</
MemberName
>
4
</
Employees
>
5
</
Group
>
XmlArrayItemAttribute 的另一種用法是,允許序列化派生類。例如,可將派生自 Employee
的另一個名為Manager
的類添加至上一示例中。如果沒有應用XmlArrayItemAttribute,代碼將在運行時失敗,原因是無法識別派生類類型。若要解決這個問題,每次為每個可接受類型(基類和派生類)設置 Type 屬性 (Property) 時,需要應用該屬性 (Attribute) 兩次。
01
public
class
Group{
02
[XmlArrayItem(Type =
typeof
(Employee)),
03
XmlArrayItem(Type =
typeof
(Manager))]
04
public
Employee[] Employees;
05
}
06
public
class
Employee{
07
public
string
Name;
08
}
09
public
class
Manager:Employee{
10
public
int
Level;
11
}
序列化實例可能如下所示。
01
<
Group
>
02
<
Employees
>
03
<
Employee
>
04
<
Name
>Haley</
Name
>
05
</
Employee
>
06
<
Employee
xsi:type
=
"Manager"
>
07
<
Name
>Ann</
Name
>
08
<
Level
>3</
Level
>
09
<
Employee
>
10
</
Employees
>
11
</
Group
>
通過將 XmlElementAttribute 應用於返回數組的字段,還可以將該數組作為 XML 元素的平面序列進行序列化,如下所示。
1
public
class
Group{
2
[XmlElement]
3
public
Employee[] Employees;
4
}
序列化實例可能如下所示。
01
<
Group
>
02
<
Employees
>
03
<
Name
>Haley</
Name
>
04
</
Employees
>
05
<
Employees
>
06
<
Name
>Noriko</
Name
>
07
</
Employees
>
08
<
Employees
>
09
<
Name
>Marco</
Name
>
10
</
Employees
>
11
</
Group
>
區別兩種 XML 流的另一個方法是,使用 XML 架構定義工具,從編譯好的代碼生成 XML 架構 (XSD) 文檔文件。沒有將屬性應用於字段時,架構會以下列方式描述元素。
<xs:element minOccurs="0" maxOccurs ="1" name="Employees" type="ArrayOfEmployee" />
將 XmlElementAttribute 應用於字段時,生成的架構會以下列方式描述元素。
<xs:element minOccurs="0" maxOccurs="unbounded" name="Employees" type="Employee" />
ArrayList 類可能包含各種不同對象的集合。因此,可以按照使用數組的類似方式使用 ArrayList。您可以創建返回單個ArrayList 的字段,而不用創建返回類型化對象的數組的字段。但是,與數組相同的是,必須將ArrayList 包含的對象的類型告知 XmlSerializer。為此,需要為該字段分配XmlElementAttribute 的多個實例,如下面的示例所示。
1
public
class
Group{
2
[XmlElement(Type =
typeof
(Employee)),
3
XmlElement(Type =
typeof
(Manager))]
4
public
ArrayList Info;
5
}
能且只能應用於一個類的屬性有下面兩種:XmlRootAttribute 和 XmlTypeAttribute。這兩種屬性非常相似。XmlRootAttribute 只能應用於一個類:序列化時,該類表示 XML 文檔的開始和結束元素,也就是根元素。另一方面,XmlTypeAttribute 可以應用於任何一個類,包括根類。
例如,在上面的示例中,Group
類就是根類,而其所有的公共字段和屬性變成 XML 文檔中的 XML 元素。因此,只能有一個根類。通過應用XmlRootAttribute,可以控制XmlSerializer 所生成的 XML 流。例如,可以更改元素名稱和命名空間。
使用 XmlTypeAttribute 可以控制所生成 XML 的架構。需要通過 XML Web services 發布架構時,這項功能很有用。下面的示例將XmlTypeAttribute 和XmlRootAttribute 同時應用於同一個類。
1
[XmlRoot(
"NewGroupName"
)]
2
[XmlType(
"NewTypeName"
)]
3
public
class
Group{
4
public
Employee[] Employees;
5
}
如果對該類進行編譯,並且使用 XML 架構定義工具生成其架構,可能會找到下面描述 Group
的 XML。
<xs:element name="NewGroupName" type="NewTypeName">
相比之下,如果是對該類的實例進行序列化,則只能在 XML 文檔中找到 NewGroupName
。
<NewGroupName> . . .</NewGroupName>
最後來貼一個自己的XML解析實例
XML結構如下:
01
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
02
<
Root
>
03
<
Person
IDCard
=
"610424199902230099"
Name
=
"小田雨"
MedicalID
=
"體檢編號"
Sex
=
"男"
Age
=
"22"
MedicalRecordDate
=
"2011-01-01"
MedicalReportDate
=
"2011-01-01"
04
MedicalCount
=
"體檢次數"
HospitalID
=
"001"
HospitalName
=
"興隆園醫院"
>
05
<
Results
>
06
<
Result
></
Result
>
07
<
Result
></
Result
>
08
<
Result
></
Result
>
09
</
Results
>
10
<
Conclusions
>
11
<
Conclusion
></
Conclusion
>
12
<
Conclusion
></
Conclusion
>
13
<
Conclusion
></
Conclusion
>
14
</
Conclusions
>
15
<
Suggestions
>
16
<
Suggestion
></
Suggestion
>
17
<
Suggestion
></
Suggestion
>
18
<
Suggestion
></
Suggestion
>
19
</
Suggestions
>
20
<
Health
> 為空(預留)</
Health
>
21
</
Person
>
22
23
<
MedicalItems
>
24
<
MedicalSub
ID
=
"0001"
Name
=
"化學檢查"
>
25
<
MedicalType
ID
=
"0001001"
Name
=
"血常規"
MedicalDoc
=
"體檢醫師名字"
MedicalDate
=
"2011-02-13"
>
26
27
<
Item
ID
=
"000100010001"
Name
=
"白細胞"
Unit
=
"G/L"
Parameters
=
"3.7--10.0"
>
28
<
Results
>H==高,L=低,N=正常</
Results
>
29
<
Value
>11.1</
Value
>
30
<
Disease
></
Disease
>
31
<
MedicalBodyPart
> </
MedicalBodyPart
>
32
<
MedicalImage
> </
MedicalImage
>
33
<
Conclusion
></
Conclusion
>
34
</
Item
>
35
<
Item
ID
=
"000100010002"
Name
=
"紅細胞"
Unit
=
"G/L"
Parameters
=
"3.7--10.0"
>
36
<
Results
>H==高,L=低,N=正常</
Results
>
37
<
Value
>11.1</
Value
>
38
<
Disease
></
Disease
>
39
<
MedicalBodyPart
> </
MedicalBodyPart
>
40
<
MedicalImage
> </
MedicalImage
>
41
<
Conclusion
></
Conclusion
>
42
</
Item
>
43
</
MedicalType
>
44
</
MedicalSub
>
45
<
MedicalSub
ID
=
"0002"
Name
=
"物理檢查"
>
46
<
MedicalType
ID
=
"0002001"
Name
=
"B超"
MedicalDoc
=
"體檢醫師名字"
MedicalDate
=
"2011-02-13"
>
47
<
Item
ID
=
"000200010001"
Name
=
"胸部B超"
Unit
=
" "
Parameters
=
""
>
48
<
Results
>A=異常,N=正常</
Results
>
49
<
Value
></
Value
>
50
<
Disease
>病種,未見異常</
Disease
>
51
<
MedicalBodyPart
>檢查部位:胸部</
MedicalBodyPart
>
52
<
MedicalImage
>影像所見</
MedicalImage
>
53
<
Conclusion
>檢查結論</
Conclusion
>
54
</
Item
>
55
<
Item
ID
=
"000200010002"
Name
=
"腹部B超"
Unit
=
" "
Parameters
=
""
>
56
<
Results
>A=異常,N=正常</
Results
>
57
<
Value
></
Value
>
58
<
Disease
>病種,未見異常</
Disease
>
59
<
MedicalBodyPart
>檢查部位:腹部</
MedicalBodyPart
>
60
<
MedicalImage
>影像所見</
MedicalImage
>
61
<
Conclusion
>檢查結論</
Conclusion
>
62
</
Item
>
63
</
MedicalType
>
64
65
</
MedicalSub
>
66
<
MedicalSub
ID
=
"0005"
Name
=
"五官科"
>
67
<
MedicalType
ID
=
"0005001"
Name
=
"眼科"
MedicalDoc
=
"體檢醫師名字"
MedicalDate
=
"2011-02-13"
>
68
<
Item
ID
=
"000500010001"
Name
=
"視力/右"
Unit
=
" "
Parameters
=
"1.0-1.5"
>
69
<
Results
>A=異常,N=正常</
Results
>
70
<
Value
>1.5</
Value
>
71
<
Disease
>病種,未見異常</
Disease
>
72
<
MedicalBodyPart
>檢查部位</
MedicalBodyPart
>
73
<
MedicalImage
>影像所見</
MedicalImage
>
74
<
Conclusion
>檢查結論</
Conclusion
>
75
</
Item
>
76
<
Item
ID
=
"000500010002"
Name
=
"矯正視力/右"
Unit
=
" "
Parameters
=
"1.0-1.5"
>
77
<
Results
>A=異常,N=正常</
Results
>
78
<
Value
>0.8</
Value
>
79
<
Disease
>病種,未見異常</
Disease
>
80
<
MedicalBodyPart
>檢查部位</
MedicalBodyPart
>
81
<
MedicalImage
>影像所見</
MedicalImage
>
82
<
Conclusion
>檢查結論</
Conclusion
>
83
</
Item
>
84
</
MedicalType
>
85
86
</
MedicalSub
>
87
</
MedicalItems
>
88
</
Root
>
C#代碼如下:
代碼有點多
001
using
System;
002
using
System.Collections.Generic;
003
using
System.Linq;
004
using
System.Text;
005
using
System.Xml;
006
using
System.Xml.Serialization;
007
008
using
System.IO;
009
010
namespace
天健接口
011
{
012
class
Program
013
{
014
static
void
Main(
string
[] args)
015
{
016
Root r =
new
Root();
017
018
r.Person =
new
Person();
019
r.Person.IDCard =
"22"
;
020
r.Person.Results =
new
List<
string
>();
021
r.Person.Results.Add(
"1"
);
022
r.Person.Results.Add(
"1"
);
023
r.Person.Results.Add(
"1"
);
024
r.Person.Suggestions =
new
List<
string
>();
025
r.Person.Suggestions.Add(
"2"
);
026
r.Person.Suggestions.Add(
"2"
);
027
r.Person.Suggestions.Add(
"2"
);
028
029
r.MedicalItems =
new
List<MedicalSub>();
030
MedicalSub ms =
new
MedicalSub();
031
ms.ID =
"ss"
;
032
ms.Name=
"de"
;
033
ms.MedicalType =
new
MedicalType();
034
ms.MedicalType.ID =
"wa"
;
035
ms.MedicalType.Name =
"s"
;
036
ms.MedicalType.MedicalDoc=
"qa"
;
037
ms.MedicalType.MedicalDate =
"2010-5-5"
;
038
ms.MedicalType.Item =
new
List<Item>();
039
Item it =
new
Item();
040
it.ID =
"f"
;
041
it.Name =
"s"
;
042
it.Results =
"s"
;
043
ms.MedicalType.Item.Add(it);
044
ms.MedicalType.Item.Add(it);
045
r.MedicalItems.Add(ms);
046
r.MedicalItems.Add(ms);
047
048
Console.WriteLine(
"序列化成功……"
);
049
Console.WriteLine(XmlSerialize.SerializeXML<Root>(r));
050
051
052
053
}
054
}
055
056
[Serializable]
057
public
class
Root
058
{
059
//[XmlElement]
060
public
Person Person;
061
062
public
List<MedicalSub> MedicalItems;
063
}
064
065
[Serializable]
066
public
class
Person
067
{
068
[XmlAttribute]
069
public
string
IDCard;
070
071
[XmlAttribute]
072
public
string
Name;
073
074
[XmlAttribute]
075
public
string
MedicalID;
076
077
[XmlAttribute]
078
public
string
Sex;
079
080
[XmlAttribute]
081
public
string
Age;
082
083
[XmlAttribute]
084
public
string
MedicalRecordDate;
085
086
[XmlAttribute]
087
public
string
MedicalReportDate;
088
089
[XmlAttribute]
090
public
string
MedicalCount;
091
092
[XmlAttribute]
093
public
string
HospitalID;
094
095
[XmlAttribute]
096
public
string
HospitalName;
097
098
[XmlArrayItem(
"Result"
)]
099
public
List<
string
> Results;
100
101
[XmlArrayItem(
"Conclusion"
)]
102
public
List<
string
> Conclusions;
103
104
[XmlArrayItem(
"Suggestion"
)]
105
public
List<
string
> Suggestions;
106
107
public
String Health;
108
}
109
110
[Serializable]
111
public
class
MedicalSub
112
{
113
[XmlAttribute]
114
public
string
ID;
115
116
[XmlAttribute]
117
public
string
Name;
118
119
public
MedicalType MedicalType;
120
121
}
122
123
[Serializable]
124
public
class
MedicalType
125
{
126
[XmlAttribute]
127
public
string
ID;
128
129
[XmlAttribute]
130
public
string
Name;
131
132
[XmlAttribute]
133
public
string
MedicalDoc;
134
135
[XmlAttribute]
136
public
string
MedicalDate;
137
138
[XmlElement]
139
public
List<Item> Item;
140
}
141
142
public
class
Item
143
{
144
[XmlAttribute]
145
public
string
ID;
146
147
[XmlAttribute]
148
public
string
Name;
149
150
[XmlAttribute]
151
public
string
Unit;
152
153
[XmlAttribute]
154
public
string
Parameters;
155
156
157
public
string
Results;
158
159
public
string
Value;
160
161
public
string
Disease;
162
163
public
string
MedicalBodyPart;
164
165
public
string
MedicalImage;
166
167
public
string
Conclusion;
168
169
170
}
171
172
173
174
175
176
177
public
class
XmlSerialize
178
{
179
/// <summary>
180
/// 反序列化XML為類實例
181
/// </summary>
182
/// <typeparam name="T"></typeparam>
183
/// <param name="xmlObj"></param>
184
/// <returns></returns>
185
public
static
T DeserializeXML<T>(
string
xmlObj)
186
{
187
XmlSerializer serializer =
new
XmlSerializer(
typeof
(T));
188
using
(StringReader reader =
new
StringReader(xmlObj))
189
{
190
return
(T)serializer.Deserialize(reader);
191
}
192
}
193
194
/// <summary>
195
/// 序列化類實例為XML
196
/// </summary>
197
/// <typeparam name="T"></typeparam>
198
/// <param name="obj"></param>
199
/// <returns></returns>
200
public
static
string
SerializeXML<T>(T obj)
201
{
202
using
(StringWriter writer =
new
StringWriter())
203
{
204
new
XmlSerializer(obj.GetType()).Serialize((TextWriter)writer, obj);
205
return
writer.ToString();
206
}
207
}
208
}
209
210
211
}
來自:http://blog.csdn.net/bdstjk/article/details/7210742