C#读写xml文件(CSDN-Markdown)

来源:互联网 发布:淘宝联盟数据采集软件 编辑:程序博客网 时间:2024/05/29 04:23

C#读写xml文件


一、要实现的目标

1、xml文件存在时,能正常读写;不存在时,能自动创建xml文件

2、能添加和更新节点。

  • 添加:将一个类的实例序列化到xml文件中
  • 更新:查找指定的节点,更新节点数据

二、适应场景

本地保存多个用户的登录信息,能对登录信息进行读取和修改。如:

“UserId”保证节点的唯一性。

三、使用的技术

1、xml文件的操作(System.Xml命名空间下类的使用)

2、利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值

四、代码

using System;using System.IO;using System.Xml;namespace TestXML{    public class XmlFileManager    {        private readonly string _fileName;        private XmlDocument _xmlDoc;        public XmlFileManager(string fileName)        {            this._fileName = fileName;        }        /// <summary>        /// 创建xml文件        /// </summary>        /// <returns>根节点</returns>        public XmlNode CreateXml()        {            _xmlDoc = new XmlDocument();            if (File.Exists(_fileName))            {                //返回根节点                _xmlDoc.Load(_fileName);                return _xmlDoc.SelectSingleNode("Users");            }            else            {                //创建类型声明节点                  var node = _xmlDoc.CreateXmlDeclaration("1.0", "utf-8", "");                _xmlDoc.AppendChild(node);                //创建根节点                  var rootNode = _xmlDoc.CreateElement("Users");                _xmlDoc.AppendChild(rootNode);                //创建文件                try                {                    _xmlDoc.Save(_fileName);                }                catch (Exception e)                {                    //                }                return rootNode;            }        }       /// <summary>        /// 添加节点       /// </summary>       /// <param name="rootNode">根节点</param>       /// <param name="name">根节点名称</param>       /// <returns></returns>        public XmlNode AddXmlNode(XmlNode rootNode, string name)        {            var node = _xmlDoc.CreateNode(XmlNodeType.Element, name, null);            rootNode.AppendChild(node);            return node;        }        /// <summary>        /// 添加节点元素        /// </summary>        /// <param name="parentNode">父节点</param>        /// <param name="obj">类的实例</param>        public void AddXmlElement(XmlNode parentNode, object obj)        {            var t = obj.GetType();            //节点存在,返回            foreach (var pi in t.GetProperties())            {                if (pi.Name == "UserId")                {                    var value = pi.GetValue(obj, null).ToString();                    if (SearchXmlNode(value) != null)                    {                        return;                    }                }             }            //节点不存在,添加            foreach (var pi in t.GetProperties())            {                var node = _xmlDoc.CreateNode(XmlNodeType.Element, pi.Name, null);                var value = pi.GetValue(obj, null);                if (value == null)                {                    value = "";                }                node.InnerText = value.ToString();                parentNode.AppendChild(node);            }            _xmlDoc.Save(_fileName);        }        /// <summary>        /// 查找指定节点        /// </summary>        /// <param name="nodeId">节点唯一标示</param>        /// <returns></returns>        public XmlNode SearchXmlNode(string nodeId)        {            var nodes = _xmlDoc.SelectNodes("//UserInfo");            if (nodes != null)            {                foreach (System.Xml.XmlNode node in nodes)                {                    if (node != null)                    {                        var singleNode = node.SelectSingleNode("UserId");                        if (singleNode != null)                        {                            if (singleNode.InnerText == nodeId)                            {                                return singleNode;                            }                        }                    }                }            }            return null;        }        /// <summary>        /// 查找指定元素        /// </summary>        /// <param name="nodeId">节点唯一标示</param>        /// <param name="elemName">节点名称</param>        /// <returns></returns>        public XmlNode SearchXmlElement(string nodeId, string elemName)        {            var nodes = _xmlDoc.SelectNodes("//UserInfo");            if (nodes != null)            {                foreach (System.Xml.XmlNode node in nodes)                {                    if (node != null)                    {                        var singleNode = node.SelectSingleNode("UserId");                        if (singleNode != null)                        {                            if (singleNode.InnerText == nodeId)                            {                                singleNode = node.SelectSingleNode(elemName);                                if (singleNode != null)                                {                                    return singleNode;                                }                            }                        }                    }                }            }            return null;        }        /// <summary>        /// 更新元素数据        /// </summary>        /// <param name="nodeId">节点唯一标示</param>        /// <param name="elemName">元素名称</param>        /// <param name="elemValue">元素值</param>        public void UpdateXmlElement(string nodeId, string elemName, string elemValue )        {           var node = SearchXmlElement(nodeId, elemName);            if (node != null)            {                node.InnerText = elemValue;                _xmlDoc.Save(_fileName);            }        }    }}

五、Demo地址

http://download.csdn.net/detail/afjafjafj2008/8456777

0 0
原创粉丝点击