【标题 】.NET操作XML文件:XML文件节点的增删改
【准备】
1、创建一个Web 窗体
2、创建一个xml文件 joyo_bookstore.xml
【源码示例】
A、joyo_bookstore.xml 文件
1
<?
xml version="1.0" encoding="gb2312"
?>
2 < bookstore >
3 < book genre ="david" ISBN ="2-3631-5" >
4 < title > david-blogs life </ title >
5 < author > david </ author >
6 < price > 58.3 </ price >
7 </ book >
8 </ bookstore >
2 < bookstore >
3 < book genre ="david" ISBN ="2-3631-5" >
4 < title > david-blogs life </ title >
5 < author > david </ author >
6 < price > 58.3 </ price >
7 </ book >
8 </ bookstore >
B、C#源代码(在Web 窗体中添加三个Button)
1
#region
生产XmlDocument对象
2 protected XmlDocument createXmlDoc()
3 {
4 XmlDocument xmldoc = new XmlDocument ();
5 xmldoc.Load ( " D://work//woall_last//Test//xml//joyo_bookstore.xml " );
6
7 return xmldoc;
8 }
9
10 #endregion
11
12 #region 添加XML文件节点
13 private void Button1_Click( object sender, System.EventArgs e)
14 {
15 XmlDocument xmldoc = createXmlDoc();
16
17 /* ===============函数原型======================================
18 * public System.Xml.XmlNode SelectSingleNode(string xpath)
19 System.Xml.XmlNode 的成员
20 摘要:
21 选择匹配 XPath 表达式的第一个 XmlNode。
22 参数:
23 xpath: XPath 表达式。
24 返回值:
25 与 XPath 查询匹配的第一个 XmlNode;如果未找到任何匹配节点,则为null。
26 * 不应该要求将 XmlNode “实时”连接到 XML 文档。
27 * 也就是说,XML 文档中的更改不会出现在 XmlNode 中,反之亦然。
28
29 ======================================================= */
30
31 // 获得根节点
32 XmlNode root = xmldoc.SelectSingleNode( " bookstore " );
33
34
35 /* ================函数原型=============================
36 * public System.Xml.XmlElement CreateElement(string name)
37 System.Xml.XmlDocument 的成员
38 摘要:
39 创建具有指定名称的元素。
40
41 参数:
42 name: 元素的限定名。如果名称包含冒号,
43 * 则 System.Xml.XmlNode.Prefix 属性反映名称中位于冒号之前的部分,
44 * System.Xml.XmlDocument.LocalName 属性反映名称中位于冒号之后的部分。
45 * 限定名不能包含“xmlns”前缀。
46 返回值:
47 新的 XmlElement。
48 ================================================ */
49 // 创建一个<book>节点
50 XmlElement xe1 = xmldoc.CreateElement( " book " );
51
52 // 设置该节点genre属性
53 xe1.SetAttribute( " genre " , " AXzhz " );
54 // 设置该节点ISBN属性
55 xe1.SetAttribute( " ISBN " , " 2-3631-4 " );
56
57 XmlElement xesub1 = xmldoc.CreateElement( " title " );
58 // 设置文本节点
59 xesub1.InnerText = " AXzhz-blogs life " ;
60
61 // 添加到<book>节点中
62 xe1.AppendChild(xesub1);
63
64 XmlElement xesub2 = xmldoc.CreateElement( " author " );
65 xesub2.InnerText = " AXzhz " ;
66 xe1.AppendChild(xesub2);
67
68 XmlElement xesub3 = xmldoc.CreateElement( " price " );
69 xesub3.InnerText = " 58.3 " ;
70 xe1.AppendChild(xesub3);
71
72 // 添加到根节点<bookstore>中
73 root.AppendChild(xe1);
74
75 xmldoc.Save( " D://work//woall_last//Test//xml//joyo_bookstore.xml " );
76 }
77 #endregion
78
79 #region 删除XML文件中的节点属性或节点
80 private void Button2_Click( object sender, System.EventArgs e)
81 {
82 XmlDocument xmldoc = createXmlDoc();
83
84 // 获得bookstore的所有根节点并遍历
85 XmlNodeList xnl = xmldoc.SelectSingleNode( " bookstore " ).ChildNodes;
86 foreach (XmlNode xn in xnl)
87 {
88 XmlElement xe = (XmlElement)xn;
89
90 if (xe.GetAttribute( " genre " ) == " david " )
91 {
92 // 删除genre属性
93 xe.RemoveAttribute( " genre " );
94
95 }
96 else if (xe.GetAttribute( " genre " ) == " update david " )
97 {
98 // 删除该节点的全部内容
99 // 注意:这xe是XmlElement对象,它的方法RemoveAll移除节点的所有指定属性和子节点,不移除默认属性
100 xe.RemoveAll();
101 }
102
103 }
104 xmldoc.Save( " D://work//woall_last//Test//xml//joyo_bookstore.xml " );
105 }
106 #endregion
107
108 #region 修改XML文件的节点:修改book节点的genre属性由david到update david , book子节点author由david到david weihw
109 private void Button3_Click( object sender, System.EventArgs e)
110 {
111 XmlDocument xmldoc = createXmlDoc();
112
113 // 获取bookstore节点的所有子节点
114 XmlNodeList nodeList = xmldoc.SelectSingleNode( " bookstore " ).ChildNodes;
115
116 // 遍历所有子节点
117 foreach (XmlNode xn in nodeList)
118 {
119 // 将子节点类型转换为XmlElement类型
120 XmlElement xe = (XmlElement)xn;
121
122 if (xe.GetAttribute( " genre " ) == " david " )
123 {
124 // 修改book节点的genre属性
125 xe.SetAttribute( " genre " , " update david " );
126
127 // 取xe子节点(xe为book节点)的所有子节点
128 XmlNodeList nls = xe.ChildNodes;
129
130 foreach (XmlNode xn1 in nls)
131 {
132
133 XmlElement xe2 = (XmlElement)xn1;
134
135 if (xe2.Name == " author " )
136 {
137 // 修改book子节点author由david到david weihw
138 xe2.InnerText = " david weihw " ;
139 break ;
140 }
141
142 }
143 break ;
144 }
145
146 }
147 xmldoc.Save( " D://work//woall_last//Test//xml//joyo_bookstore.xml " );
148
149 }
150 #endregion
2 protected XmlDocument createXmlDoc()
3 {
4 XmlDocument xmldoc = new XmlDocument ();
5 xmldoc.Load ( " D://work//woall_last//Test//xml//joyo_bookstore.xml " );
6
7 return xmldoc;
8 }
9
10 #endregion
11
12 #region 添加XML文件节点
13 private void Button1_Click( object sender, System.EventArgs e)
14 {
15 XmlDocument xmldoc = createXmlDoc();
16
17 /* ===============函数原型======================================
18 * public System.Xml.XmlNode SelectSingleNode(string xpath)
19 System.Xml.XmlNode 的成员
20 摘要:
21 选择匹配 XPath 表达式的第一个 XmlNode。
22 参数:
23 xpath: XPath 表达式。
24 返回值:
25 与 XPath 查询匹配的第一个 XmlNode;如果未找到任何匹配节点,则为null。
26 * 不应该要求将 XmlNode “实时”连接到 XML 文档。
27 * 也就是说,XML 文档中的更改不会出现在 XmlNode 中,反之亦然。
28
29 ======================================================= */
30
31 // 获得根节点
32 XmlNode root = xmldoc.SelectSingleNode( " bookstore " );
33
34
35 /* ================函数原型=============================
36 * public System.Xml.XmlElement CreateElement(string name)
37 System.Xml.XmlDocument 的成员
38 摘要:
39 创建具有指定名称的元素。
40
41 参数:
42 name: 元素的限定名。如果名称包含冒号,
43 * 则 System.Xml.XmlNode.Prefix 属性反映名称中位于冒号之前的部分,
44 * System.Xml.XmlDocument.LocalName 属性反映名称中位于冒号之后的部分。
45 * 限定名不能包含“xmlns”前缀。
46 返回值:
47 新的 XmlElement。
48 ================================================ */
49 // 创建一个<book>节点
50 XmlElement xe1 = xmldoc.CreateElement( " book " );
51
52 // 设置该节点genre属性
53 xe1.SetAttribute( " genre " , " AXzhz " );
54 // 设置该节点ISBN属性
55 xe1.SetAttribute( " ISBN " , " 2-3631-4 " );
56
57 XmlElement xesub1 = xmldoc.CreateElement( " title " );
58 // 设置文本节点
59 xesub1.InnerText = " AXzhz-blogs life " ;
60
61 // 添加到<book>节点中
62 xe1.AppendChild(xesub1);
63
64 XmlElement xesub2 = xmldoc.CreateElement( " author " );
65 xesub2.InnerText = " AXzhz " ;
66 xe1.AppendChild(xesub2);
67
68 XmlElement xesub3 = xmldoc.CreateElement( " price " );
69 xesub3.InnerText = " 58.3 " ;
70 xe1.AppendChild(xesub3);
71
72 // 添加到根节点<bookstore>中
73 root.AppendChild(xe1);
74
75 xmldoc.Save( " D://work//woall_last//Test//xml//joyo_bookstore.xml " );
76 }
77 #endregion
78
79 #region 删除XML文件中的节点属性或节点
80 private void Button2_Click( object sender, System.EventArgs e)
81 {
82 XmlDocument xmldoc = createXmlDoc();
83
84 // 获得bookstore的所有根节点并遍历
85 XmlNodeList xnl = xmldoc.SelectSingleNode( " bookstore " ).ChildNodes;
86 foreach (XmlNode xn in xnl)
87 {
88 XmlElement xe = (XmlElement)xn;
89
90 if (xe.GetAttribute( " genre " ) == " david " )
91 {
92 // 删除genre属性
93 xe.RemoveAttribute( " genre " );
94
95 }
96 else if (xe.GetAttribute( " genre " ) == " update david " )
97 {
98 // 删除该节点的全部内容
99 // 注意:这xe是XmlElement对象,它的方法RemoveAll移除节点的所有指定属性和子节点,不移除默认属性
100 xe.RemoveAll();
101 }
102
103 }
104 xmldoc.Save( " D://work//woall_last//Test//xml//joyo_bookstore.xml " );
105 }
106 #endregion
107
108 #region 修改XML文件的节点:修改book节点的genre属性由david到update david , book子节点author由david到david weihw
109 private void Button3_Click( object sender, System.EventArgs e)
110 {
111 XmlDocument xmldoc = createXmlDoc();
112
113 // 获取bookstore节点的所有子节点
114 XmlNodeList nodeList = xmldoc.SelectSingleNode( " bookstore " ).ChildNodes;
115
116 // 遍历所有子节点
117 foreach (XmlNode xn in nodeList)
118 {
119 // 将子节点类型转换为XmlElement类型
120 XmlElement xe = (XmlElement)xn;
121
122 if (xe.GetAttribute( " genre " ) == " david " )
123 {
124 // 修改book节点的genre属性
125 xe.SetAttribute( " genre " , " update david " );
126
127 // 取xe子节点(xe为book节点)的所有子节点
128 XmlNodeList nls = xe.ChildNodes;
129
130 foreach (XmlNode xn1 in nls)
131 {
132
133 XmlElement xe2 = (XmlElement)xn1;
134
135 if (xe2.Name == " author " )
136 {
137 // 修改book子节点author由david到david weihw
138 xe2.InnerText = " david weihw " ;
139 break ;
140 }
141
142 }
143 break ;
144 }
145
146 }
147 xmldoc.Save( " D://work//woall_last//Test//xml//joyo_bookstore.xml " );
148
149 }
150 #endregion
【执行结果】
1、执行Button1_Click方法后,joyo_bookstore.xml文件为
1
<?
xml version="1.0" encoding="gb2312"
?>
2 < bookstore >
3 < book genre ="david" ISBN ="2-3631-5" >
4 < title > david-blogs life </ title >
5 < author > david </ author >
6 < price > 58.3 </ price >
7 </ book >
8 < book genre ="AXzhz" ISBN ="2-3631-4" >
9 < title > AXzhz-blogs life </ title >
10 < author > AXzhz </ author >
11 < price > 58.3 </ price >
12 </ book >
13 </ bookstore >
2 < bookstore >
3 < book genre ="david" ISBN ="2-3631-5" >
4 < title > david-blogs life </ title >
5 < author > david </ author >
6 < price > 58.3 </ price >
7 </ book >
8 < book genre ="AXzhz" ISBN ="2-3631-4" >
9 < title > AXzhz-blogs life </ title >
10 < author > AXzhz </ author >
11 < price > 58.3 </ price >
12 </ book >
13 </ bookstore >
2、执行Button3_Click方法后,joyo_bookstore.xml文件为
1
<?
xml version="1.0" encoding="gb2312"
?>
2 < bookstore >
3 < book genre ="update david" ISBN ="2-3631-5" >
4 < title > david-blogs life </ title >
5 < author > david weihw </ author >
6 < price > 58.3 </ price >
7 </ book >
8 < book genre ="AXzhz" ISBN ="2-3631-4" >
9 < title > AXzhz-blogs life </ title >
10 < author > AXzhz </ author >
11 < price > 58.3 </ price >
12 </ book >
13 </ bookstore >
2 < bookstore >
3 < book genre ="update david" ISBN ="2-3631-5" >
4 < title > david-blogs life </ title >
5 < author > david weihw </ author >
6 < price > 58.3 </ price >
7 </ book >
8 < book genre ="AXzhz" ISBN ="2-3631-4" >
9 < title > AXzhz-blogs life </ title >
10 < author > AXzhz </ author >
11 < price > 58.3 </ price >
12 </ book >
13 </ bookstore >
3、执行Button2_Click方法后,joyo_bookstore.xml文件为
1
<?
xml version="1.0" encoding="gb2312"
?>
2 < bookstore >
3 < book >
4 </ book >
5 < book genre ="AXzhz" ISBN ="2-3631-4" >
6 < title > AXzhz-blogs life </ title >
7 < author > AXzhz </ author >
8 < price > 58.3 </ price >
9 </ book >
10 </ bookstore >
2 < bookstore >
3 < book >
4 </ book >
5 < book genre ="AXzhz" ISBN ="2-3631-4" >
6 < title > AXzhz-blogs life </ title >
7 < author > AXzhz </ author >
8 < price > 58.3 </ price >
9 </ book >
10 </ bookstore >
【总结】
1、在XmlDocument.Load方法中,可以使用物理绝对路径D://work//woall_last//Test//xml//joyo_bookstore.xml
或使用URL格式地址,比如 http://test.fenlei.cn/Test/xml/joyo_bookstore.xml
如果直接使用相对路径joyo_bookstore.xml,会发生异常:
未能找到文件“c:/windows/system32/inetsrv/joyo_bookstore.xml”。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.IO.FileNotFoundException: 未能找到文件“c:/windows/system32/inetsrv/joyo_bookstore.xml”。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.IO.FileNotFoundException: 未能找到文件“c:/windows/system32/inetsrv/joyo_bookstore.xml”。
2、对象XmlElement 和XmlNode 的RemoveAll只能移除节点的属性与所有子节点。
3、在实际的开发过程中,可以把上述的方法封装成操作XML的类,实现代码的复用。