XML文件在存储、交换和传输数据信息上有着很方便处理,那么今天这篇文章主要讲一下用C#如何实现对XML文件的基本操作,如:创建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文件请看下述C#代码:
01 | using System; |
02 | using System.Collections.Generic; |
03 | using System.Linq; |
04 | using System.Text; |
05 | using System.Xml; |
06 | |
07 | namespace OperateXML |
08 | { |
09 |
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 |
} |
20 |
catch (Exception ex) |
21 |
{ |
22 |
Console.WriteLine(ex.ToString()); |
23 |
} |
24 |
} |
25 | |
26 |
private static void GenerateXMLFile( string xmlFilePath) |
27 |
{ |
28 |
try |
29 |
{ |
30 |
//初始化一个xml实例 |
31 |
XmlDocument myXmlDoc = new XmlDocument(); |
32 |
//创建xml的根节点 |
33 |
XmlElement rootElement = myXmlDoc.CreateElement( "Computers" ); |
34 |
//将根节点加入到xml文件中(AppendChild) |
35 |
myXmlDoc.AppendChild(rootElement); |
36 | |
37 |
//初始化第一层的第一个子节点 |
38 |
XmlElement firstLevelElement1 = myXmlDoc.CreateElement( "Computer" ); |
39 |
//填充第一层的第一个子节点的属性值(SetAttribute) |
40 |
firstLevelElement1.SetAttribute( "ID" , "11111111" ); |
41 |
firstLevelElement1.SetAttribute( "Description" , "Made in China" ); |
42 |
//将第一层的第一个子节点加入到根节点下 |
43 |
rootElement.AppendChild(firstLevelElement1); |
44 |
//初始化第二层的第一个子节点 |
45 |
XmlElement secondLevelElement11 = myXmlDoc.CreateElement( "name" ); |
46 |
//填充第二层的第一个子节点的值(InnerText) |
47 |
secondLevelElement11.InnerText = "Lenovo" ; |
48 |
firstLevelElement1.AppendChild(secondLevelElement11); |
49 |
XmlElement secondLevelElement12 = myXmlDoc.CreateElement( "price" ); |
50 |
secondLevelElement12.InnerText = "5000" ; |
51 |
firstLevelElement1.AppendChild(secondLevelElement12); |
52 | |
53 | |
54 |
XmlElement firstLevelElement2 = myXmlDoc.CreateElement( "Computer" ); |
55 |
firstLevelElement2.SetAttribute( "ID" , "2222222" ); |
56 |
firstLevelElement2.SetAttribute( "Description" , "Made in USA" ); |
57 |
rootElement.AppendChild(firstLevelElement2); |
58 |
XmlElement secondLevelElement21 = myXmlDoc.CreateElement( "name" ); |
59 |
secondLevelElement21.InnerText = "IBM" ; |
60 |
firstLevelElement2.AppendChild(secondLevelElement21); |
61 |
XmlElement secondLevelElement22 = myXmlDoc.CreateElement( "price" ); |
62 |
secondLevelElement22.InnerText = "10000" ; |
63 |
firstLevelElement2.AppendChild(secondLevelElement22); |
64 | |
65 |
//将xml文件保存到指定的路径下 |
66 |
myXmlDoc.Save(xmlFilePath); |
67 |
} |
68 |
catch (Exception ex) |
69 |
{ |
70 |
Console.WriteLine(ex.ToString()); |
71 |
} |
72 |
} |
73 |
} |
74 | } |
运行这样一段代码就可以在E盘中生成相应的xml文件Computers.xml,这个方法显得比较笨拙,但是很实在,基础好用~~
- 知道怎么生成xml文件之后,下一步就要了解:如何读取xml文件(即:遍历xml文件的节点信息)
下面的这段代码实现了对xml文件节点信息的读取,代码有详细的注解,在此不过多解释。代码如下:
01 | using System; |
02 | using System.Collections.Generic; |
03 | using System.Linq; |
04 | using System.Text; |
05 | using System.Xml; |
06 | |
07 | namespace OperateXML |
08 | { |
09 |
class Program |
10 |
{ |
11 |
static void Main( string [] args) |
12 |
{ |
13 |
try |
14 |
{ |
15 |
//xml文件存储路径 |
16 |
string myXMLFilePath = "E://MyComputers.xml" ; |
17 |
//遍历xml文件的信息 |
18 |
GetXMLInformation(myXMLFilePath); |
19 |
} |
20 |
catch (Exception ex) |
21 |
{ |
22 |
Console.WriteLine(ex.ToString()); |
23 |
} |
24 |
} |
25 | |
26 |
private static void GetXMLInformation( string xmlFilePath) |
27 |
{ |
28 |
try |
29 |
{ |
30 |
//初始化一个xml实例 |
31 |
XmlDocument myXmlDoc = new XmlDocument(); |
32 |
//加载xml文件(参数为xml文件的路径) |
33 |
myXmlDoc.Load(xmlFilePath); |
34 |
//获得第一个姓名匹配的节点(SelectSingleNode):此xml文件的根节点 |
35 |
XmlNode rootNode = myXmlDoc.SelectSingleNode( "Computers" ); |
36 |
//分别获得该节点的InnerXml和OuterXml信息 |
37 |
string innerXmlInfo = rootNode.InnerXml.ToString(); |
38 |
string outerXmlInfo = rootNode.OuterXml.ToString(); |
39 |
//获得该节点的子节点(即:该节点的第一层子节点) |
40 |
XmlNodeList firstLevelNodeList = rootNode.ChildNodes; |
41 |
foreach (XmlNode node in firstLevelNodeList) |
42 |
{ |
43 |
//获得该节点的属性集合 |
44 |
XmlAttributeCollection attributeCol = node.Attributes; |
45 |
foreach (XmlAttribute attri in attributeCol) |
46 |
{ |
47 |
//获取属性名称与属性值 |
48 |
string name = attri.Name; |
49 |
string value = attri.Value; |
50 |
Console.WriteLine( "{0} = {1}" , name, value); |
51 |
} |
52 | |
53 |
//判断此节点是否还有子节点 |
54 |
if (node.HasChildNodes) |
55 |
{ |
56 |
//获取该节点的第一个子节点 |
57 |
XmlNode secondLevelNode1 = node.FirstChild; |
58 |
//获取该节点的名字 |
59 |
string name = secondLevelNode1.Name; |
60 |
//获取该节点的值(即:InnerText) |
61 |
string innerText = secondLevelNode1.InnerText; |
62 |
Console.WriteLine( "{0} = {1}" , name, innerText); |
63 | |
64 |
//获取该节点的第二个子节点(用数组下标获取) |
65 |
XmlNode secondLevelNode2 = node.ChildNodes[1]; |
66 |
name = secondLevelNode2.Name; |
67 |
innerText = secondLevelNode2.InnerText; |
68 |
Console.WriteLine( "{0} = {1}" , name, innerText); |
69 |
} |
70 |
} |
71 |
} |
72 |
catch (Exception ex) |
73 |
{ |
74 |
Console.WriteLine(ex.ToString()); |
75 |
} |
76 |
} |
77 |
} |
78 | } |
这里要强调一点:XmlElement是XmlNode的继承,所以XmlElement可以调用更加多的方法,实现相应的功能。
- 接下来要实现对xml文件节点信息的修改
假设我们要修改上面刚刚生成的xml文件的<Computer ID="2222222" Description="Made in USA">这条信息
改成<Computer ID="2222222" Description="Made in HongKong">
请看如下代码实现方案:
01 | using System; |
02 | using System.Collections.Generic; |
03 | using System.Linq; |
04 | using System.Text; |
05 | using System.Xml; |
06 | |
07 | namespace OperateXML |
08 | { |
09 |
class Program |
10 |
{ |
11 |
static void Main( string [] args) |
12 |
{ |
13 |
try |
14 |
{ |
15 |
//xml文件存储路径 |
16 |
string myXMLFilePath = "E://MyComputers.xml" ; |
17 |
//修改xml文件的节点信息 |
18 |
ModifyXmlInformation(myXMLFilePath); |
19 |
} |
20 |
catch (Exception ex) |
21 |
{ |
22 |
Console.WriteLine(ex.ToString()); |
23 |
} |
24 |
} |
25 | |
26 |
private static void ModifyXmlInformation( string xmlFilePath) |
27 |
{ |
28 |
try |
29 |
{ |
30 |
XmlDocument myXmlDoc = new XmlDocument(); |
31 |
myXmlDoc.Load(xmlFilePath); |
32 |
XmlNode rootNode = myXmlDoc.FirstChild; |
33 |
XmlNodeList firstLevelNodeList = rootNode.ChildNodes; |
34 |
foreach (XmlNode node in firstLevelNodeList) |
35 |
{ |
36 |
//修改此节点的属性值 |
37 |
if (node.Attributes[ "Description" ].Value.Equals( "Made in USA" , StringComparison.InvariantCultureIgnoreCase)) |
38 |
{ |
39 |
node.Attributes[ "Description" ].Value = "Made in HongKong" ; |
40 |
} |
41 |
} |
42 |
//要想使对xml文件所做的修改生效,必须执行以下Save方法 |
43 |
myXmlDoc.Save(xmlFilePath); |
44 |
} |
45 |
catch (Exception ex) |
46 |
{ |
47 |
Console.WriteLine(ex.ToString()); |
48 |
} |
49 | |
50 |
} |
51 | |
52 |
} |
53 | } |
运行上面这段代码,就可以实现预期的更改,代码很好理解,在此不过多啰嗦。
- 下面实现向xml文件中的相应位置插入节点信息
假设我们想通过插入节点将原来的xml文件结构变成如下所示
<
Computers
>
<
Computer
ID
="
11111111
"
Description
="
Made in China
"
>
<
name
>
Lenovo
</
name
>
<
price
>
5000
</
price
>
<
color
IsMixed
="
Yes
"
>
black
</
color
>
</
Computer
>
<
Computer
ID
="
2222222
"
Description
="
Made in USA
"
>
<
name
>
IBM
</
name
>
<
price
>
10000
</
price
>
<
color
IsMixed
="
Yes
"
>
black
</
color
>
</
Computer
>
</
Computers
>
代码如下所示:
01 | using System; |
02 | using System.Collections.Generic; |
03 | using System.Linq; |
04 | using System.Text; |
05 | using System.Xml; |
06 | |
07 | namespace OperateXML |
08 | { |
09 |
class Program |
10 |
{ |
11 |
static void Main( string [] args) |
12 |
{ |
13 |
try |
14 |
{ |
15 |
//xml文件存储路径 |
16 |
string myXMLFilePath = "E://MyComputers.xml" ; |
17 |
//向xml文件添加节点信息 |
18 |
AddXmlInformation(myXMLFilePath); |
19 |
} |
20 |
catch (Exception ex) |
21 |
{ |
22 |
Console.WriteLine(ex.ToString()); |
23 |
} |
24 |
} |
25 | |
26 |
private static void AddXmlInformation( string xmlFilePath) |
27 |
{ |
28 |
try |
29 |
{ |
30 |
XmlDocument myXmlDoc = new XmlDocument(); |
31 |
myXmlDoc.Load(xmlFilePath); |
32 |
//添加一个带有属性的节点信息 |
33 |
foreach (XmlNode node in myXmlDoc.FirstChild.ChildNodes) |
34 |
{ |
35 |
XmlElement newElement = myXmlDoc.CreateElement( "color" ); |
36 |
newElement.InnerText = "black" ; |
37 |
newElement.SetAttribute( "IsMixed" , "Yes" ); |
38 |
node.AppendChild(newElement); |
39 |
} |
40 |
//保存更改 |
41 |
myXmlDoc.Save(xmlFilePath); |
42 |
} |
43 |
catch (Exception ex) |
44 |
{ |
45 |
Console.WriteLine(ex.ToString()); |
46 |
} |
47 |
} |
48 | |
49 |
} |
50 | } |
- 下面实现删除指定xml文件节点信息(即:将刚刚添加上的节点删除掉)代码如下:
01 | using System; |
02 | using System.Collections.Generic; |
03 | using System.Linq; |
04 | using System.Text; |
05 | using System.Xml; |
06 | |
07 | namespace OperateXML |
08 | { |
09 |
class Program |
10 |
{ |
11 |
static void Main( string [] args) |
12 |
{ |
13 |
try |
14 |
{ |
15 |
//xml文件存储路径 |
16 |
string myXMLFilePath = "E://MyComputers.xml" ; |
17 |
//删除xml文件节点信息 |
18 |
DeleteXmlInformation(myXMLFilePath); |
19 |
} |
20 |
catch (Exception ex) |
21 |
{ |
22 |
Console.WriteLine(ex.ToString()); |
23 |
} |
24 |
} |
25 | |
26 |
private static void DeleteXmlInformation( string xmlFilePath) |
27 |
{ |
28 |
try |
29 |
{ |
30 |
XmlDocument myXmlDoc = new XmlDocument(); |
31 |
myXmlDoc.Load(xmlFilePath); |
32 |
foreach (XmlNode node in myXmlDoc.FirstChild.ChildNodes) |
33 |
{ |
34 |
//记录该节点下的最后一个子节点(简称:最后子节点) |
35 |
XmlNode lastNode = node.LastChild; |
36 |
//删除最后子节点下的左右子节点 |
37 |
lastNode.RemoveAll(); |
38 |
//删除最后子节点 |
39 |
node.RemoveChild(lastNode); |
40 |
} |
41 |
//保存对xml文件所做的修改 |
42 |
myXmlDoc.Save(xmlFilePath); |
43 |
} |
44 |
catch (Exception ex) |
45 |
{ |
46 |
Console.WriteLine(ex.ToString()); |
47 |
} |
48 |
} |
49 | |
50 |
} |
51 | } |
运行上段代码之后就可以实现对相应节点的删除。