XML文档的操作管理器XMLHelper类c#
这是下面要操作的XML文档:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?xml version="1.0" encoding="utf-8"?> <books> <book id="1" ISDN="1001001001"> <name>我的世界我的梦</name> <author>姚明</author> <date>2008-09-23</date> </book> <book id="2" ISDN="2002000230032"> <name>围城</name> <author>钱钟书</author> <date>2008-09-23</date> </book> <book id="3" /> </books> |
以下是XMLHelper文档操作帮助类代码:
1 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 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 |
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Xml; namespace WebApplication2 { /// <summary> /// XMLHelper XML文档操作管理器 /// </summary> public class XMLHelper { public XMLHelper() { // // TODO: 在此处添加构造函数逻辑 // } #region XML文档节点查询和读取 /// <summary> /// 选择匹配XPath表达式的第一个节点XmlNode. /// </summary> /// <param name="xmlFileName">XML文档完全文件名(包含物理路径)</param> /// <param name="xpath">要匹配的XPath表达式(例如:"//节点名//子节点名")</param> /// <returns>返回XmlNode</returns> public static XmlNode GetXmlNodeByXpath(string xmlFileName, string xpath) { XmlDocument xmlDoc = new XmlDocument(); try { xmlDoc.Load(xmlFileName); //加载XML文档 XmlNode xmlNode = xmlDoc.SelectSingleNode(xpath); return xmlNode; } catch (Exception ex) { return null; //throw ex; //这里可以定义你自己的异常处理 } } /// <summary> /// 选择匹配XPath表达式的节点列表XmlNodeList. /// </summary> /// <param name="xmlFileName">XML文档完全文件名(包含物理路径)</param> /// <param name="xpath">要匹配的XPath表达式(例如:"//节点名//子节点名")</param> /// <returns>返回XmlNodeList</returns> public static XmlNodeList GetXmlNodeListByXpath(string xmlFileName, string xpath) { XmlDocument xmlDoc = new XmlDocument(); try { xmlDoc.Load(xmlFileName); //加载XML文档 XmlNodeList xmlNodeList = xmlDoc.SelectNodes(xpath); return xmlNodeList; } catch (Exception ex) { return null; //throw ex; //这里可以定义你自己的异常处理 } } /// <summary> /// 选择匹配XPath表达式的第一个节点的匹配xmlAttributeName的属性XmlAttribute. /// </summary> /// <param name="xmlFileName">XML文档完全文件名(包含物理路径)</param> /// <param name="xpath">要匹配的XPath表达式(例如:"//节点名//子节点名</param> /// <param name="xmlAttributeName">要匹配xmlAttributeName的属性名称</param> /// <returns>返回xmlAttributeName</returns> public static XmlAttribute GetXmlAttribute(string xmlFileName, string xpath, string xmlAttributeName) { string content = string.Empty; XmlDocument xmlDoc = new XmlDocument(); XmlAttribute xmlAttribute = null; try { xmlDoc.Load(xmlFileName); //加载XML文档 XmlNode xmlNode = xmlDoc.SelectSingleNode(xpath); if (xmlNode != null) { if (xmlNode.Attributes.Count > 0) { xmlAttribute = xmlNode.Attributes[xmlAttributeName]; } } } catch (Exception ex) { throw ex; //这里可以定义你自己的异常处理 } return xmlAttribute; } #endregion #region XML文档创建和节点或属性的添加、修改 /// <summary> /// 创建一个XML文档 /// </summary> /// <param name="xmlFileName">XML文档完全文件名(包含物理路径)</param> /// <param name="rootNodeName">XML文档根节点名称(须指定一个根节点名称)</param> /// <param name="version">XML文档版本号(必须为:"1.0")</param> /// <param name="encoding">XML文档编码方式</param> /// <param name="standalone">该值必须是"yes"或"no",如果为null,Save方法不在XML声明上写出独立属性</param> /// <returns>成功返回true,失败返回false</returns> public static bool CreateXmlDocument(string xmlFileName, string rootNodeName, string version, string encoding, string standalone) { bool isSuccess = false; try { XmlDocument xmlDoc = new XmlDocument(); XmlDeclaration xmlDeclaration = xmlDoc.CreateXmlDeclaration(version, encoding, standalone); XmlNode root = xmlDoc.CreateElement(rootNodeName); xmlDoc.AppendChild(xmlDeclaration); xmlDoc.AppendChild(root); xmlDoc.Save(xmlFileName); isSuccess = true; } catch (Exception ex) { throw ex; //这里可以定义你自己的异常处理 } return isSuccess; } /// <summary> /// 依据匹配XPath表达式的第一个节点来创建它的子节点(如果此节点已存在则追加一个新的同名节点 /// </summary> /// <param name="xmlFileName">XML文档完全文件名(包含物理路径)</param> /// <param name="xpath">要匹配的XPath表达式(例如:"//节点名//子节点名</param> /// <param name="xmlNodeName">要匹配xmlNodeName的节点名称</param> /// <param name="innerText">节点文本值</param> /// <param name="xmlAttributeName">要匹配xmlAttributeName的属性名称</param> /// <param name="value">属性值</param> /// <returns>成功返回true,失败返回false</returns> public static bool CreateXmlNodeByXPath(string xmlFileName, string xpath, string xmlNodeName, string innerText, string xmlAttributeName, string value) { bool isSuccess = false; XmlDocument xmlDoc = new XmlDocument(); try { xmlDoc.Load(xmlFileName); //加载XML文档 XmlNode xmlNode = xmlDoc.SelectSingleNode(xpath); if (xmlNode != null) { //存不存在此节点都创建 XmlElement subElement = xmlDoc.CreateElement(xmlNodeName); subElement.InnerXml = innerText; //如果属性和值参数都不为空则在此新节点上新增属性 if (!string.IsNullOrEmpty(xmlAttributeName) && !string.IsNullOrEmpty(value)) { XmlAttribute xmlAttribute = xmlDoc.CreateAttribute(xmlAttributeName); xmlAttribute.Value = value; subElement.Attributes.Append(xmlAttribute); } xmlNode.AppendChild(subElement); } xmlDoc.Save(xmlFileName); //保存到XML文档 isSuccess = true; } catch (Exception ex) { throw ex; //这里可以定义你自己的异常处理 } return isSuccess; } /// <summary> /// 依据匹配XPath表达式的第一个节点来创建或更新它的子节点(如果节点存在则更新,不存在则创建) /// </summary> /// <param name="xmlFileName">XML文档完全文件名(包含物理路径)</param> /// <param name="xpath">要匹配的XPath表达式(例如:"//节点名//子节点名</param> /// <param name="xmlNodeName">要匹配xmlNodeName的节点名称</param> /// <param name="innerText">节点文本值</param> /// <returns>成功返回true,失败返回false</returns> public static bool CreateOrUpdateXmlNodeByXPath(string xmlFileName, string xpath, string xmlNodeName, string innerText) { bool isSuccess = false; bool isExistsNode = false;//标识节点是否存在 XmlDocument xmlDoc = new XmlDocument(); try { xmlDoc.Load(xmlFileName); //加载XML文档 XmlNode xmlNode = xmlDoc.SelectSingleNode(xpath); if (xmlNode != null) { //遍历xpath节点下的所有子节点 foreach (XmlNode node in xmlNode.ChildNodes) { if (node.Name.ToLower() == xmlNodeName.ToLower()) { //存在此节点则更新 node.InnerXml = innerText; isExistsNode = true; break; } } if (!isExistsNode) { //不存在此节点则创建 XmlElement subElement = xmlDoc.CreateElement(xmlNodeName); subElement.InnerXml = innerText; xmlNode.AppendChild(subElement); } } xmlDoc.Save(xmlFileName); //保存到XML文档 isSuccess = true; } catch (Exception ex) { throw ex; //这里可以定义你自己的异常处理 } return isSuccess; } /// <summary> /// 依据匹配XPath表达式的第一个节点来创建或更新它的属性(如果属性存在则更新,不存在则创建) /// </summary> /// <param name="xmlFileName">XML文档完全文件名(包含物理路径)</param> /// <param name="xpath">要匹配的XPath表达式(例如:"//节点名//子节点名</param> /// <param name="xmlAttributeName">要匹配xmlAttributeName的属性名称</param> /// <param name="value">属性值</param> /// <returns>成功返回true,失败返回false</returns> public static bool CreateOrUpdateXmlAttributeByXPath(string xmlFileName, string xpath, string xmlAttributeName, string value) { bool isSuccess = false; bool isExistsAttribute = false;//标识属性是否存在 XmlDocument xmlDoc = new XmlDocument(); try { xmlDoc.Load(xmlFileName); //加载XML文档 XmlNode xmlNode = xmlDoc.SelectSingleNode(xpath); if (xmlNode != null) { //遍历xpath节点中的所有属性 foreach (XmlAttribute attribute in xmlNode.Attributes) { if (attribute.Name.ToLower() == xmlAttributeName.ToLower()) { //节点中存在此属性则更新 attribute.Value = value; isExistsAttribute = true; break; } } if (!isExistsAttribute) { //节点中不存在此属性则创建 XmlAttribute xmlAttribute = xmlDoc.CreateAttribute(xmlAttributeName); xmlAttribute.Value = value; xmlNode.Attributes.Append(xmlAttribute); } } xmlDoc.Save(xmlFileName); //保存到XML文档 isSuccess = true; } catch (Exception ex) { throw ex; //这里可以定义你自己的异常处理 } return isSuccess; } #endregion #region XML文档节点或属性的删除 /// <summary> /// 删除匹配XPath表达式的第一个节点(节点中的子元素同时会被删除) /// </summary> /// <param name="xmlFileName">XML文档完全文件名(包含物理路径)</param> /// <param name="xpath">要匹配的XPath表达式(例如:"//节点名//子节点名</param> /// <returns>成功返回true,失败返回false</returns> public static bool DeleteXmlNodeByXPath(string xmlFileName, string xpath) { bool isSuccess = false; XmlDocument xmlDoc = new XmlDocument(); try { xmlDoc.Load(xmlFileName); //加载XML文档 XmlNode xmlNode = xmlDoc.SelectSingleNode(xpath); if (xmlNode != null) { //删除节点 xmlNode.ParentNode.RemoveChild(xmlNode); } xmlDoc.Save(xmlFileName); //保存到XML文档 isSuccess = true; } catch (Exception ex) { throw ex; //这里可以定义你自己的异常处理 } return isSuccess; } /// <summary> /// 删除匹配XPath表达式的第一个节点中的匹配参数xmlAttributeName的属性 /// </summary> /// <param name="xmlFileName">XML文档完全文件名(包含物理路径)</param> /// <param name="xpath">要匹配的XPath表达式(例如:"//节点名//子节点名</param> /// <param name="xmlAttributeName">要删除的xmlAttributeName的属性名称</param> /// <returns>成功返回true,失败返回false</returns> public static bool DeleteXmlAttributeByXPath(string xmlFileName, string xpath, string xmlAttributeName) { bool isSuccess = false; bool isExistsAttribute = false; XmlDocument xmlDoc = new XmlDocument(); try { xmlDoc.Load(xmlFileName); //加载XML文档 XmlNode xmlNode = xmlDoc.SelectSingleNode(xpath); XmlAttribute xmlAttribute = null; if (xmlNode != null) { //遍历xpath节点中的所有属性 foreach (XmlAttribute attribute in xmlNode.Attributes) { if (attribute.Name.ToLower() == xmlAttributeName.ToLower()) { //节点中存在此属性 xmlAttribute = attribute; isExistsAttribute = true; break; } } if (isExistsAttribute) { //删除节点中的属性 xmlNode.Attributes.Remove(xmlAttribute); } } xmlDoc.Save(xmlFileName); //保存到XML文档 isSuccess = true; } catch (Exception ex) { throw ex; //这里可以定义你自己的异常处理 } return isSuccess; } /// <summary> /// 删除匹配XPath表达式的第一个节点中的所有属性 /// </summary> /// <param name="xmlFileName">XML文档完全文件名(包含物理路径)</param> /// <param name="xpath">要匹配的XPath表达式(例如:"//节点名//子节点名</param> /// <returns>成功返回true,失败返回false</returns> public static bool DeleteAllXmlAttributeByXPath(string xmlFileName, string xpath) { bool isSuccess = false; XmlDocument xmlDoc = new XmlDocument(); try { xmlDoc.Load(xmlFileName); //加载XML文档 XmlNode xmlNode = xmlDoc.SelectSingleNode(xpath); if (xmlNode != null) { //遍历xpath节点中的所有属性 xmlNode.Attributes.RemoveAll(); } xmlDoc.Save(xmlFileName); //保存到XML文档 isSuccess = true; } catch (Exception ex) { throw ex; //这里可以定义你自己的异常处理 } return isSuccess; } #endregion } } |
1.创建XML文档:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
//这是XML文档根节点名 string rootNodeName = "books"; //这是XML文档物理文件名(包含物理路径) string xmlFileName = Application.StartupPath + @"\book.xml"; XMLHelper.CreateXmlDocument(xmlFileName, rootNodeName, "1.0", "utf-8", null); MessageBox.Show("XML文档创建成功:" + xmlFileName); |
2.向XML文档中添加一个新节点:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
string xmlFileName = Application.StartupPath + @"\book.xml"; string xpath = "/books"; //这是新节点的父节点路径 string nodename = "book"; //这是新节点名称,在父节点下新增 string nodetext = "这是新节点中的文本值"; bool isSuccess = XMLHelper.CreateOrUpdateXmlNodeByXPath(xmlFileName, xpath, nodename, nodetext); MessageBox.Show("XML节点添加或更新成功:" + isSuccess.ToString()); |
3.向XML文档中的子节点中新增或修改(如果存在则修改)一个子节点,比如name,author,date节点等:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
string xmlFileName = Application.StartupPath + @"\book.xml"; string xpath = "/books/book"; //这是新子节点的父节点路径 string nodename = "name"; //这是新子节点名称,在父节点下新增 string nodetext = "我的世界我的梦"; bool isSuccess = XMLHelper.CreateOrUpdateXmlNodeByXPath(xmlFileName, xpath, nodename, nodetext); MessageBox.Show("XML节点添加或更新成功:" + isSuccess.ToString()); |
4. 向XML文档中的子节点中新增或修改(如果存在则修改)一个子节点属性,比如id,ISDN属性等:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
string xmlFileName = Application.StartupPath + @"\book.xml"; string xpath = "/books/book"; //要新增属性的节点 string attributeName = "id"; //新属性名称,ISDN号也是这么新增的 string attributeValue = "1"; //新属性值 bool isSuccess = XMLHelper.CreateOrUpdateXmlAttributeByXPath(xmlFileName, xpath, attributeName, attributeValue); MessageBox.Show("XML属性添加或更新成功:" + isSuccess.ToString()); |
5. 删除XML文档中的子节点:
1 2 3 4 5 |
string xmlFileName = Application.StartupPath + @"\book.xml"; string xpath = "/books/book[@id='1']"; //要删除的id为1的book子节点 bool isSuccess = XMLHelper.DeleteXmlNodeByXPath(xmlFileName, xpath); MessageBox.Show("XML节点删除成功:" + isSuccess.ToString()); |
6. 删除XML文档中子节点的属性:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
string xmlFileName = Application.StartupPath + @"\book.xml"; //删除id为2的book子节点中的ISDN属性 string xpath = "/books/book[@id='2']"; string attributeName = "ISDN"; bool isSuccess = XMLHelper.DeleteXmlAttributeByXPath(xmlFileName, xpath,attributeName); MessageBox.Show("XML属性删除成功:" + isSuccess.ToString()); |
7.读取XML文档中的所有子节点:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
string xmlFileName = Application.StartupPath + @"\book.xml"; //要读的id为1的book子节点 string xpath = "/books/book[@id='1']"; XmlNodeList nodeList = XMLHelper.GetXmlNodeListByXpath(xmlFileName, xpath); string strAllNode = ""; //遍历节点中所有的子节点 foreach (XmlNode node in nodeList) { strAllNode += "\n name:" + node.Name + " InnerText:" + node.InnerText; } MessageBox.Show("XML节点中所有子节点有:" + strAllNode); |
8.其它的方法我就不一一的例举了,各位自己动手去尝试便知,关键的地方就是那个xpath的参数设置了,
这个是XML文档中xpath语法,大家去网上一查便明白,好了,我要休息去,明白偶还有很多的工作做…