C#读写xml总结

        private void readXml() 
        {
            // 读取的基本思路:
            // 可以一次获取一个节点列表出来:XmlNodeList = XmlDocument.GetElementsByTagName("节点名称")
            // 遍历这个节点列表:foreach (XmlElement item in xmlNodeList) {}
            // 获取一个节点的属性值:XmlElement.GetAttribute("属性名");
            // 获取一个节点的子节点列表:XmlNodeList = XmlElement.ChildNodes;
            // 获取XmlNodeList的某个子节点:xnl[i]
            // 获取XmlNodeList的某个子节点的节点值:xnl[i].InnerXml

            string fileName = @"D:\test.xml";
            XmlDocument xd = new XmlDocument();
            xd.Load(fileName);
            XmlNodeList xmlNodeList = xd.GetElementsByTagName("user");
            List<User> users = new List<User>();

            foreach (XmlElement item in xmlNodeList) 
            {
                User user = new User();
                user.Id = int.Parse(item.GetAttribute("id"));
                XmlNodeList xnl = item.ChildNodes;
                user.Name = xnl[0].InnerXml;
                user.Age = int.Parse(xnl[1].InnerXml);
                user.Gender = xnl[2].InnerXml;
                users.Add(user);
            }
            foreach (var item in users) 
            {
                Debug.WriteLine(item);
            }
        }

        private void writeXml()
        {
            // 基本思路是:
            // 创建xml声明:XmlNode = XmlDocument.CreateXmlDeclaration("1.0", "utf-8", null);
            // 创建一个节点:XmlElement = XmlDocument.CreateElement("节点名");
            // 给节点设置属性:XmlElement.SetAttribute("属性名","属性值");
            // 给节点设置Text:XmlElement.InnerText = "值"
            // 添加子节点到父节点:XmlElement.AppendChild(子节点);


            Debug.WriteLine("test ok!");

            string fileName = @"D:\test.xml";
            XmlDocument xmlDoc = new XmlDocument();
            XmlNode header = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null);
            xmlDoc.AppendChild(header);

            XmlElement rootNode = xmlDoc.CreateElement("users");

            List<User> list = GetUsers();
            foreach (var item in list) 
            {
                XmlElement xn = InsertUser(item, xmlDoc);
                rootNode.AppendChild(xn);
            }
            xmlDoc.AppendChild(rootNode);
            xmlDoc.Save(fileName);
        }

        private static XmlElement InsertUser(User user, XmlDocument xmlDoc) 
        {
            // 创建一个节点,标签是user
            XmlElement xn = xmlDoc.CreateElement("user");
            // 给这个节点设置一个属性名为id,并为此属性赋值
            xn.SetAttribute("id", user.Id + "");
            // 此标签下append新的节点
            xn.AppendChild(GetXmlNode(xmlDoc,"name",user.Name));
            xn.AppendChild(GetXmlNode(xmlDoc, "age", user.Age + ""));
            xn.AppendChild(GetXmlNode(xmlDoc, "gender", user.Gender));
            return xn;
        }

        private static XmlElement GetXmlNode(XmlDocument xmlDoc, string name, string value) 
        {
            // 创建一个节点,被赋予text值,但是不赋予属性
            XmlElement xn = xmlDoc.CreateElement(name);
            xn.InnerText = value;
            return xn;
        }

        private static List<User> GetUsers() 
        {
            List<User> list = new List<User>();
            for (int i = 0; i < 10; i++) 
            {
                User user = new User();
                user.Id = i;
                user.Name = "Name" + i;
                user.Age = 15;
                user.Gender = "男";
                list.Add(user);
            }
            return list;
        }



user类:

    class User
    {
        public int Id { set; get; }
        public string Name { get; set; }
        public int Age { get; set; }
        public string Gender { set; get; }
        public override string ToString()
        {
            return Id + "," + Name + "," + Age + "," + Gender;
        }
    }


// 注意非法字符转义

&lt;  <  小于

&gt; >  大于

&amp;  &  和号

&apos;  '  单引号

&quot;   "  双引号

只需要在xml里面,对应的非法字符替换为左边的转义字符,则读写都按照当没有这个转义存在一样

比如xml里:

      <add key="key1" value="hello"/>
      <add key="key2" value="world!"/>
      <add key="CIF" value="1"/>
      <add key="C&amp;F" value="2"/>
      <add key="FOB" value="3"/>
      <add key="C&amp;I" value="4"/>
      <add key="市场价" value="5"/>
      <add key="垫仓" value="6"/>
在代码里如常访问:

            string key1 = ConfigSettings.ReadSetting("C&F");
            Debug.WriteLine("C&F=" + key1);

其他:

读取路径下所有xml文件:

            var files = Directory.GetFiles(readPath, "*.xml");
            foreach (var file in files) 
            {
                Debug.WriteLine("file=" + file);
            }
file=D:\download\CTRCV2017020810421600037160562.xml
file=D:\download\CTRCV2017022315481300041130625.xml

或者:

            DirectoryInfo folder = new DirectoryInfo(readPath);

            foreach (FileInfo file in folder.GetFiles("*.xml"))
            {
                Debug.WriteLine(file.FullName);
            }
D:\download\CTRCV2017020810421600037160562.xml
D:\download\CTRCV2017022315481300041130625.xml

如果路径不存在则创建:

                    if (Directory.Exists(readPath + @"\BACKUP") == false) 
                    {
                        Directory.CreateDirectory(readPath + @"\BACKUP");
                    }
把文件拷贝到另一个目录:

                    System.IO.File.Copy(path, readPath + @"\BACKUP\" + fileName);
删除某个文件:

                    File.Delete(path);



参考这里:https://www.cnblogs.com/hhzz/p/6592452.html







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值