C# XML文件的读写和Java相差不大,主要是借助xpath寻址定位,然后针对指定节点或元素进行操作,具体代码如下: using System; using System.Collections.Generic; using System.Text; using System.Xml; using System.Xml.XPath; using System.IO; namespace Tools.Xml { /// <summary> /// xml文件操作类 /// Author : Wison Xu /// </summary> public class XmlTool { private XmlDocument doc; private string filePath; private readonly object writeLock = new object(); public XmlTool() { } public XmlTool(string filePath) { LoadXmlFile(filePath); } /// <summary> /// 获取当前关联xml文件路径 /// </summary> public string FilePath { get { return filePath; } } /// <summary> /// 创建XmlDocument对象 /// </summary> /// <param name="filepath">xml文件路径</param> private void CreateDocument(string filePath) { try { using (FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate)) { using (XmlReader reader = XmlReader.Create(fs)) { doc = new XmlDocument(); doc.Load(reader); } } } catch (Exception e) { Console.WriteLine(e.Message); } } /// <summary> /// 加载xml文件 /// </summary> /// <param name="filepath">xml文件路径</param> public void LoadXmlFile(string filePath) { this.filePath = filePath; CreateDocument(filePath); } #region 读XML文件操作 /// <summary> /// 根据xpath获得单个节点属性字典 /// </summary> /// <param name="xpath">xml结构路径</param> /// <returns>属性字典</returns> public Dictionary<string, string> SelectSingleNodeAttrs(string xpath) { Dictionary<string, string> map = new Dictionary<string, string>(); try { XmlNode node = doc.SelectSingleNode(xpath); foreach (XmlAttribute attr in node.Attributes) { map.Add(attr.Name, attr.Value); } } catch (Exception e) { Console.WriteLine(e.Message); } return map; } /// <summary> /// 获得节点内文本 /// </summary> /// <param name="xpath">节点xpath</param> /// <returns>文本</returns> public string SelectSingleNodeInnerText(string xpath) { string text = null; XmlNode node = null; try { node = doc.SelectSingleNode(xpath); text = node.InnerText; } catch (Exception e) { Console.WriteLine(e.Message); } return text; } #endregion #region 写XML文件操作 /// <summary> /// 添加节点相关元素 /// </summary> /// <param name="xpath">节点xpath</param> /// <param name="innerText">节点内文本</param> /// <param name="attrs">属性列表</param> /// <param name="values">属性值列表</param> /// <returns>操作返回结果</returns> public bool CreateNodeElement(string xpath, string innerText, string[] attrs, string[] values) { lock (writeLock) { bool flag = false; try { if (AttrsValuesConutIsMatch(attrs, values)) { XmlElement newElement = doc.SelectSingleNode(xpath) as XmlElement; if (null != newElement) { if (null != attrs && null != values) { for (int i = 0; i < attrs.Length; i++) { newElement.SetAttribute(attrs[i], values[i]); } } if (null != innerText) { newElement.InnerText = innerText; } doc.Save(filePath); flag = true; } } } catch (Exception e) { Console.WriteLine(e.Message); } return flag; } } /// <summary> /// 为节点内添加文本 /// </summary> /// <param name="xpath">节点xpath</param> /// <param name="innerText">节点内文本</param> /// <returns>操作返回结果</returns> public bool CreateInnerText(string xpath, string innerText) { return CreateNodeElement(xpath, innerText, null, null); } /// <summary> /// 创建指定节点的属性 /// </summary> /// <param name="xpath">节点xpath</param> /// <param name="attrs">属性列表</param> /// <param name="values">属性值列表</param> /// <returns>操作返回结果</returns> public bool CreateAttributes(string xpath, string[] attrs, string[] values) { return CreateNodeElement(xpath, null, attrs, values); } /// <summary> /// 创建xml节点 /// </summary> /// <param name="parentXpath">新节点父节点xpath</param> /// <param name="nodeName">新节点名称</param> /// <param name="innerText">新节点内文本</param> /// <param name="attrs">新节点属性列表</param> /// <param name="values">新节点属性值列表</param> /// <returns>操作返回结果</returns> public bool CreateNode(string parentXpath, string nodeName, string innerText, string[] attrs, string[] values) { lock (writeLock) { bool flag = false; try { if (AttrsValuesConutIsMatch(attrs, values)) { XmlNode parentNode = doc.SelectSingleNode(parentXpath); XmlElement newElement = doc.CreateElement(nodeName); if (null != attrs && null != values) { for (int i = 0; i < attrs.Length; i++) { newElement.SetAttribute(attrs[i], values[i]); } } if (null != innerText) { newElement.InnerText = innerText; } parentNode.AppendChild(newElement); doc.Save(filePath); flag = true; } } catch (Exception e) { Console.WriteLine(e.Message); } return flag; } } /// <summary> /// 创建xml节点 /// </summary> /// <param name="parentXpath">新节点父节点xpath</param> /// <param name="nodeName">新节点名称</param> /// <param name="innerText">新节点内文本</param> /// <returns>操作返回结果</returns> public bool CreateNode(string parentXpath, string nodeName, string innerText) { return CreateNode(parentXpath, nodeName, innerText, null, null); } /// <summary> /// 创建xml节点 /// </summary> /// <param name="parentXpath">新节点父节点xpath</param> /// <param name="nodeName">新节点名称</param> /// <param name="attrs">新节点属性列表</param> /// <param name="values">新节点属性值列表</param> /// <returns>操作返回结果</returns> public bool CreateNode(string parentXpath, string nodeName, string[] attrs, string[] values) { return CreateNode(parentXpath, nodeName, null, attrs, values); } /// <summary> /// 创建xml节点 /// </summary> /// <param name="parentXpath">新节点父节点xpath</param> /// <param name="nodeName">新节点名称</param> /// <returns>操作返回结果</returns> public bool CreateNode(string parentXpath, string nodeName) { return CreateNode(parentXpath, nodeName, null, null, null); } #endregion /// <summary> /// 验证属性和值的个数是否匹配 /// </summary> /// <param name="attrs">属性列表</param> /// <param name="values">值列表</param> /// <returns>是否匹配</returns> private bool AttrsValuesConutIsMatch(string[] attrs, string[] values) { if (null != attrs && null != values && attrs.Length != values.Length) { return false; } else if ((null != attrs && null == values) || (null == attrs && null != values)) { return false; } return true; } } }