C#-.xml和.ini 保存配置信息 using System.Xml.Linq;using System.Runtime.InteropServices;

本文介绍如何使用Linq to XML进行XML文件的基本操作,包括创建、读取、增加、删除和修改等,并提供示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

XML

xml是常见的配置文件。

https://blog.youkuaiyun.com/songyi160/article/details/50824274

         三种常用的读取XML文件的方法。分别是

         ①使用XmlDocument

         ②使用XmlTextReader

         ③使用Linq to Xml

         以下是使用Linq to Xml的方法实现对XML文档的创建、读取、增加、删除、修改、查询的操作。
 

创建:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Threading.Tasks;
using System.Xml.Linq;

namespace CreateXML
{
    class Program
    {
        static void Main(string[] args)
        {
            XDocument xdoc = new XDocument();
            //创建根节点
            XElement root = new XElement("school");
            //创建子节点
            XElement cls = new XElement("class");
            //子节点属性
            cls.SetAttributeValue("number", "0312");
            //子节点的子节点
            XElement stu1 = new XElement("student");
            //添加子节点属性
            stu1.SetAttributeValue("id", "001"); //添加子节点stu1的属性,如学号001
            stu1.SetElementValue("name", "张三"); //添加子节点stu1的数据,如姓名张三
            stu1.SetElementValue("gender", "男"); //添加子节点stu1的数据,如性别男
            stu1.SetElementValue("age", "19"); //添加子节点stu1的数据,如年龄19
             //创建子节点class的子节点学生stu2
            XElement stu2 = new XElement("student");
            stu2.SetAttributeValue("id", "002"); //添加子节点stu2的属性,如学号002
            stu2.SetElementValue("name", "李晓梅"); //添加子节点stu2的数据,如姓名李晓梅
            stu2.SetElementValue("gender", "女"); //添加子节点stu2的数据,如性别女
            stu2.SetElementValue("age", "18"); //添加子节点stu2的数据,如年龄18

            //最后把节点school class student关联起来,组成一个二叉树样式
            cls.Add(stu1);
            cls.Add(stu2);
            root.Add(cls);
            xdoc.Add(root); //添加根节点到XDoucment对象
            xdoc.Save("D://1.xml"); //使用XML的保存会自动在xml文件开始添加:<?xml version="1.0" encoding="utf-8"?>
            Console.WriteLine("创建XML文件成功!");
            Console.ReadKey();

        }
    }
}

 

读取:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Threading.Tasks;
using System.Xml.Linq;

namespace CreateXML
{
    class Program
    {
        static void Main(string[] args)
        {
            XDocument xdoc = XDocument.Load("D://1.xml");
            XElement schoolroot = xdoc.Root;
            IEnumerable<XElement> xeles = schoolroot.Elements();
            foreach (XElement x in xeles)
            {
                foreach (XElement xeleStudent in x.Elements())
                {
                   Console.WriteLine(xeleStudent.Name); //获取节点名
                    Console.WriteLine(xeleStudent.Attribute("id").Value); //获取属性值
                    Console.WriteLine(xeleStudent.Element("name").Value); //下面3行是获取数据
                    Console.WriteLine(xeleStudent.Element("gender").Value);
                    Console.WriteLine(xeleStudent.Element("age").Value);
                }

            }
            Console.ReadKey();
        }
    }
}

 

增加:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Threading.Tasks;
using System.Xml.Linq;

namespace CreateXML
{
    class Program
    {
        static void Main(string[] args)
        {
            XDocument xdoc = XDocument.Load("D://1.xml");
            XElement xeleRoot = xdoc.Root;
            //在已存在的节点上添加属性和数据
            XElement xeleClass = xeleRoot.Element("class");
            XElement xeleStu3 = new XElement("student");
            xeleStu3.SetAttributeValue("id", "005");
            xeleStu3.SetElementValue("name", "王五");
            xeleStu3.SetElementValue("gender", "男");
            xeleStu3.SetElementValue("age", "40");
            xeleClass.Add(xeleStu3);

             //在根节点下添加新的直接子节点及次级节点的属性和数据
            XElement xeleClass2 = new XElement("class");
            xeleClass2.SetAttributeValue("number", "0501");
            XElement xeleStu1 = new XElement("student");
            xeleStu1.SetAttributeValue("id", "003");
            xeleStu1.SetElementValue("name", "刘芳");
            xeleStu1.SetElementValue("gender", "女");
            xeleStu1.SetElementValue("age", "26");
            XElement xeleStu2 = new XElement("student");
            xeleStu2.SetAttributeValue("id", "004");
            xeleStu2.SetElementValue("name", "王亮");
            xeleStu2.SetElementValue("gender", "男");
            xeleStu2.SetElementValue("age", "36");
            xeleClass2.Add(xeleStu1);
            xeleClass2.Add(xeleStu2);
            xeleRoot.Add(xeleClass);
 
            xdoc.Save("D://1.xml");
            Console.WriteLine("添加xml成功");
            Console.ReadKey();
        }
    }
}

删除;

            XDocument xdoc = XDocument.Load("1.xml");
            XElement xeleRoot = xdoc.Root;
 
            //删除根节点的直接子节点
            //先找到该节点
            XElement xeleClass = xeleRoot.Elements("class").Where(x =>            x.Attribute("number").Value == "0302").Single(); //拉姆达表达式
            //删除
            xeleClass.Remove();
 
            //删除根节点的直接子节点的下一级节点
            //XElement xeleClass = xeleRoot.Elements("class").Where(x => x.Attribute("number").Value == "0302").Single(); //获取班级号为0302的直接子节点
            //XElement xeleStudent = xeleClass.Elements("student").Where(x => x.Attribute("id").Value == "001").Single(); //获取学号为001的直接子节点的下一级节点
            //xeleStudent.Remove();
 
            xdoc.Save("1.xml");
            Console.WriteLine("删除节点成功!");
            Console.ReadKey();

 

修改:


            XDocument xdoc = XDocument.Load("1.xml");
            XElement xeleRoot = xdoc.Root;
            XElement xeleClass = xeleRoot.Elements("class").Where(x => x.Attribute("number").Value == "0302").Single(); //获取班级号为0302的直接子节点
            XElement xeleStudent = xeleClass.Elements("student").Where(x => x.Attribute("id").Value == "001").Single(); //获取学号为001的直接子节点的下一级节点
            xeleStudent.SetAttributeValue("id", "008");
            xeleStudent.SetElementValue("name","邦德");
            xeleStudent.SetElementValue("gender","爷们");
            xeleStudent.SetElementValue("age","39");
            xdoc.Save("1.xml");
            Console.WriteLine("修改成功!");
            Console.ReadKey();

INI

 在做项目过程中,有时需要保存一些简单的配置信息,可以使用xml,也可以使用INI文件。下面是

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Runtime.InteropServices;

namespace CreateXML
{
    class Program
    {
        //声明API函数

        [DllImport("kernel32")]
        private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
        [DllImport("kernel32")]
        private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
          [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        private static extern uint GetPrivateProfileSection(string lpAppName, IntPtr lpReturnedString, uint nSize, string lpFileName);


        static void Main(string[] args)
        {
            //写
            WritePrivateProfileString("class", "student1", "ZhangSan","D://1.ini");//写的同时创建ini
            WritePrivateProfileString("class", "student2", "LiSi", "D://1.ini");
            //读
            StringBuilder temp = new StringBuilder(500);
            int i = GetPrivateProfileString("class", "student2", "", temp, 500, "D://1.ini");
            Console.WriteLine(temp.ToString());
            //删除
            WritePrivateProfileString("class", "student2", "null", "D://1.ini");
            Console.ReadKey();
        }
          /// <summary>
        /// 根据section取所有key
        /// </summary>
        /// <param name="section"></param>
        /// <param name="filePath"></param>
        /// <returns></returns>
        public static string[] ReadIniAllKeys(string section,string filePath)
        {
            UInt32 MAX_BUFFER = 32767;  
 
            string[] items = new string[0];  
 
            IntPtr pReturnedString = Marshal.AllocCoTaskMem((int)MAX_BUFFER * sizeof(char));
 
            UInt32 bytesReturned = GetPrivateProfileSection(section, pReturnedString, MAX_BUFFER, filePath);
 
            if (!(bytesReturned == MAX_BUFFER - 2) || (bytesReturned == 0))
            {
                string returnedString = Marshal.PtrToStringAuto(pReturnedString, (int)bytesReturned);
 
                items = returnedString.Split(new char[] { '\0' }, StringSplitOptions.RemoveEmptyEntries);
            }
 
            Marshal.FreeCoTaskMem(pReturnedString); 
 
            return items;
        }
        private static string ReadString(string section, string key, string def, string filePath)
        {
            StringBuilder temp = new StringBuilder(1024);
 
            try
            {
                GetPrivateProfileString(section, key, def, temp, 1024, filePath);
            }
            catch
            { }
            return temp.ToString();
        }
        /// <summary>
        /// 根据section,key取值
        /// </summary>
        /// <param name="section"></param>
        /// <param name="keys"></param>
        /// <param name="filePath">ini文件路径</param>
        /// <returns></returns>
        public static string ReadIniKeys(string section, string keys, string filePath)
        {
            return ReadString(section, keys, "", filePath);
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值