XML:Extensible Markup Language(可扩展标记语言)的缩写,是用来定义其它语言的一种元语言,其前身是SGML(Standard Generalized
Markup Language,标准通用标记语言)。它没有标签集(tag set),也没有语法规则(grammatical rule),但是它有句法规则(syntax rule)。
任何XML文档对任何类型的应用以及正确的解析都必须是良构的(well-formed),即每一个打开的标签都必须有匹配的结束标签,不得
含有次序颠倒的标签,并且在语句构成上应符合技术规范的要求。XML文档可以是有效的(valid),但并非一定要求有效。所谓有效文档是指其符合其文档
类型定义(DTD)的文档。如果一个文档符合一个模式(schema)的规定,那么这个文档是"模式有效的(schema valid)"。
XML文件在存储、交换和传输数据信息上有着很方便处理,那么今天这篇文章主要讲一下用C#如何实现对XML文件的基本操作,
如:创建xml文件,增、删、改、查xml的节点信息。所使用的方法很基础,方便易懂(用于自己的学习和记忆只需,同时也希望能够给你带来一些帮助,
如有不合适的地方欢迎大家批评指正)。
本文的主要模块为:
① :生成xml文件
② :遍历xml文件的节点信息
③ :修改xml文件的节点信息
④ :向xml文件添加节点信息
⑤ :删除指定xml文件的节点信息
<Computers>
<Computer ID="11111111" Description="Made in China">
<name>Lenovo</name>
<price>5000</price>
</Computer>
<Computer ID="2222222" Description="Made in USA">
<name>IBM</name>
<price>10000</price>
</Computer>
</Computers>
那么如何生成这个xml文件?又怎么读取这个xml文件的节点信息,以及如何对这个xml文件的节点信息作相应的操作?请看如下代码示例:
【注:因为我们要使用xml相关的语法和方法,所以一定要引入命名空间 System.Xml】
1
using
System;
2
using
System.Collections.Generic;
3
using
System.Linq;
4
using
System.Text;
5
using
System.Xml;
6
7
namespace
OperateXML
8
{
9
class
Program
10
{
11
static
void
Main(
string
[] args)
12
{
13
try
14
{
15
//
xml文件存储路径
16
string
myXMLFilePath
=
"
E:\\MyComputers.xml
"
;
17
//
生成xml文件
18
GenerateXMLFile(myXMLFilePath);
19
//
遍历xml文件的信息
20
GetXMLInformation(myXMLFilePath);
21
//
修改xml文件的信息
22
ModifyXmlInformation(myXMLFilePath);
23
//
向xml文件添加节点信息
24
AddXmlInformation(myXMLFilePath);
25
//
删除指定节点信息
26
DeleteXmlInformation(myXMLFilePath);
27
}
28
catch
(Exception ex)
29
{
30
Console.WriteLine(ex.ToString());
31
}
32
}
33
34
private
static
void
GenerateXMLFile(
string
xmlFilePath)
35
{
36
try
37
{
38
//
初始化一个xml实例
39
XmlDocument myXmlDoc
=
new
XmlDocument();
40
//
创建xml的根节点
41
XmlElement rootElement
=
myXmlDoc.CreateElement(
"
Computers
"
);
42
//
将根节点加入到xml文件中(AppendChild)
43
myXmlDoc.AppendChild(rootElement);
44
45
//
初始化第一层的第一个子节点
46
XmlElement firstLevelElement1
=
myXmlDoc.CreateElement(
"
Computer
"
);
47
//
填充第一层的第一个子节点的属性值(SetAttribute)
48
firstLevelElement1.SetAttribute(
"
ID
"
,
"
11111111
"
);
49
firstLevelElement1.SetAttribute(
"
Description
"
,
"
Made in China
"
);
50
//
将第一层的第一个子节点加入到根节点下
51
rootElement.AppendChild(firstLevelElement1);
52
//
初始化第二层的第一个子节点
53
XmlElement secondLevelElement11
=
myXmlDoc.CreateElement(
"
name
"
);
54
//
填充第二层的第一个子节点的值(InnerText)
55
secondLevelElement11.InnerText
=
"
Lenovo
"
;
56
firstLevelElement1.AppendChild(secondLevelElement11);
57
XmlElement secondLevelElement12
=
myXmlDoc.CreateElement(
"
price
"
);
58
secondLevelElement12.InnerText
=
"
5000
"
;
59
firstLevelElement1.AppendChild(secondLevelElement12);
60
61
62
XmlElement firstLevelElement2
=
myXmlDoc.CreateElement(
"
Computer
"
);
63
firstLevelElement2.SetAttribute(
"
ID
"
,
"
2222222
"
);
64
firstLevelElement2.SetAttribute(
"
Description
"
,
"
Made in USA
"
);
65
rootElement.AppendChild(firstLevelElement2);
66
XmlElement secondLevelElement21
=
myXmlDoc.CreateElement(
"
name
"
);
67
secondLevelElement21.InnerText
=
"
IBM
"
;
68
firstLevelElement2.AppendChild(secondLevelElement21);
69
XmlElement secondLevelElement22
=
myXmlDoc.CreateElement(
"
price
"
);
70
secondLevelElement22.InnerText
=
"
10000
"
;
71
firstLevelElement2.AppendChild(secondLevelElement22);
72
73
//
将xml文件保存到指定的路径下
74
myXmlDoc.Save(xmlFilePath);
75
}
76
catch
(Exception ex)
77
{
78
Console.WriteLine(ex.ToString());
79
}
80
}
81
82
private
static
void
GetXMLInformation(
string
xmlFilePath)
83
{
84
try
85
{
86
//
初始化一个xml实例
87
XmlDocument myXmlDoc
=
new
XmlDocument();
88
//
加载xml文件(参数为xml文件的路径)
89
myXmlDoc.Load(xmlFilePath);
90
//
获得第一个姓名匹配的节点(SelectSingleNode):此xml文件的根节点
91
XmlNode rootNode
=
myXmlDoc.SelectSingleNode(
"
Computers
"
);
92
//
分别获得该节点的InnerXml和OuterXml信息
93
string
innerXmlInfo
=
rootNode.InnerXml.ToString();
94
string
outerXmlInfo
=
rootNode.OuterXml.ToString();
95
//
获得该节点的子节点(即:该节点的第一层子节点)
96
XmlNodeList firstLevelNodeList
=
rootNode.ChildNodes;
97
foreach
(XmlNode node
in
firstLevelNodeList)
98
{
99
//
获得该节点的属性集合
100
XmlAttributeCollection attributeCol
=
node.Attributes;
101
foreach
(XmlAttribute attri
in
attributeCol)
102
{
103
//
获取属性名称与属性值
104
string
name
=
attri.Name;
105
string
value
=
attri.Value;
106
Console.WriteLine(
"
{0} = {1}
"
, name, value);
107
}
108
109
//
判断此节点是否还有子节点
110
if
(node.HasChildNodes)
111
{
112
//
获取该节点的第一个子节点
113
XmlNode secondLevelNode1
=
node.FirstChild;
114
//
获取该节点的名字
115
string
name
=
secondLevelNode1.Name;
116
//
获取该节点的值(即:InnerText)
117
string
innerText
=
secondLevelNode1.InnerText;
118
Console.WriteLine(
"
{0} = {1}
"
, name, innerText);
119
120
//
获取该节点的第二个子节点(用数组下标获取)
121
XmlNode secondLevelNode2
=
node.ChildNodes[
1
];
122
name
=
secondLevelNode2.Name;
123
innerText
=
secondLevelNode2.InnerText;
124
Console.WriteLine(
"
{0} = {1}
"
, name, innerText);
125
}
126
}
127
}
128
catch
(Exception ex)
129
{
130
Console.WriteLine(ex.ToString());
131
}
132
}
133
134
private
static
void
ModifyXmlInformation(
string
xmlFilePath)
135
{
136
try
137
{
138
XmlDocument myXmlDoc
=
new
XmlDocument();
139
myXmlDoc.Load(xmlFilePath);
140
XmlNode rootNode
=
myXmlDoc.FirstChild;
141
XmlNodeList firstLevelNodeList
=
rootNode.ChildNodes;
142
foreach
(XmlNode node
in
firstLevelNodeList)
143
{
144
//
修改此节点的属性值
145
if
(node.Attributes[
"
Description
"
].Value.Equals(
"
Made in USA
"
))
146
{
147
node.Attributes[
"
Description
"
].Value
=
"
Made in HongKong
"
;
148
}
149
}
150
//
要想使对xml文件所做的修改生效,必须执行以下Save方法
151
myXmlDoc.Save(xmlFilePath);
152
}
153
catch
(Exception ex)
154
{
155
Console.WriteLine(ex.ToString());
156
}
157
158
}
159
160
private
static
void
AddXmlInformation(
string
xmlFilePath)
161
{
162
try
163
{
164
XmlDocument myXmlDoc
=
new
XmlDocument();
165
myXmlDoc.Load(xmlFilePath);
166
//
添加一个带有属性的节点信息
167
foreach
(XmlNode node
in
myXmlDoc.FirstChild.ChildNodes)
168
{
169
XmlElement newElement
=
myXmlDoc.CreateElement(
"
color
"
);
170
newElement.InnerText
=
"
black
"
;
171
newElement.SetAttribute(
"
IsMixed
"
,
"
Yes
"
);
172
node.AppendChild(newElement);
173
}
174
//
保存更改
175
myXmlDoc.Save(xmlFilePath);
176
}
177
catch
(Exception ex)
178
{
179
Console.WriteLine(ex.ToString());
180
}
181
}
182
183
private
static
void
DeleteXmlInformation(
string
xmlFilePath)
184
{
185
try
186
{
187
XmlDocument myXmlDoc
=
new
XmlDocument();
188
myXmlDoc.Load(xmlFilePath);
189
foreach
(XmlNode node
in
myXmlDoc.FirstChild.ChildNodes)
190
{
191
//
记录该节点下的最后一个子节点(简称:最后子节点)
192
XmlNode lastNode
=
node.LastChild;
193
//
删除最后子节点下的左右子节点
194
lastNode.RemoveAll();
195
//
删除最后子节点
196
node.RemoveChild(lastNode);
197
}
198
//
保存对xml文件所做的修改
199
myXmlDoc.Save(xmlFilePath);
200
}
201
catch
(Exception ex)
202
{
203
Console.WriteLine(ex.ToString());
204
}
205
}
206
}
207
}
208
上面的这个例子,首先是通过GenerateXMLFile方法在E盘创建出了我们预想的xml文件;然后通过GetXMLInformation方法对刚刚生成的xml文件进行了信息的读取;
之后通过ModifyXmlInformation方法对xml文件信息作出相应的修改(<Computer ID="2222222" Description="Made in USA">
修改成为<Computer ID="2222222" Description="Made in HongKong">);再之后通过AddXmlInformation方法向xml文件中添加了一个带有属性值的color节点;
最后通过DeleteXmlInformation方法将刚刚添加上的color节点删除掉。至此完成了对xml文件的基本操作:创建、读取、修改、添加、删除。
【注1:想要将对xml文件所做的任何修改生效的话,必须调用Save方法,否则我们所做的修改不会保存】
【注2:我们在创建节点的时候用的是XmlElement,但是读取节点信息的时候却用的是XmlNode,这里强调一点:XmlElement是XmlNode的继承,可以调用更多的方法
实现相应所需的功能】
最后简单集中的总结一下对xml进行操作的基本方法,如下所示:
//所需要添加的命名空间
using System.Xml;
//初始化一个xml实例
XmlDocument xml=new XmlDocument();
//导入指定xml文件
xml.Load(“xml文件路径path”);
//指定一个节点
XmlNode root=xml.SelectSingleNode("节点名称");
//获取节点下所有直接子节点
XmlNodeList childlist=root.ChildNodes;
//判断该节点下是否有子节点
root.HasChildNodes;
//获取同名同级节点集合
XmlNodeList nodelist=xml.SelectNodes("节点名称");
//生成一个新节点
XmlElement node=xml.CreateElement("节点名称");
//将节点加到指定节点下,作为其子节点
root.AppendChild(node);
//将节点加到指定节点下某个子节点前
root.InsertBefore(node,root.ChildeNodes[i]);
//为指定节点的新建属性并赋值
node.SetAttribute("id","11111");
//为指定节点添加子节点
root.AppendChild(node);
//获取指定节点的指定属性值
string id=node.Attributes["id"].Value;
//获取指定节点中的文本
string content=node.InnerText;
//保存XML文件
xml.Save(“xml文件存储的路径path”);
更多信息请看: http://www.cnblogs.com/fish-li/archive/2013/05/05/3061816.html