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);
}
}
}