xml 文件结构:
<?xml version="1.0" encoding="utf-8"?>
<persons>
<person id="1">
<name>water</name>
<age>25</age>
</person>
<person id="2">
<name>wolf</name>
<age>26</age>
</person>
</persons>
Linq 方式 操作Xml类
public class XMLService
{
public string xmlPath { set; get; }
private XElement xElement = null;
public XMLService(string xmlPath)
{
this.xmlPath = xmlPath;
CreateFile(xmlPath);
xElement = XElement.Load(xmlPath);
}
public XMLService() { }
/// <summary>
/// 创建xml文件
/// </summary>
/// <param name="xmlPath"></param>
private void CreateFile(string xmlPath)
{
if (!File.Exists(xmlPath))
{
XElement element = new XElement("persons");
element.Save(xmlPath);
}
}
/// <summary>
/// 加载xml文件
/// </summary>
/// <param name="xmlPath"></param>
public void Load(string xmlPath)
{
this.xmlPath = xmlPath;
CreateFile(xmlPath);
xElement = XElement.Load(xmlPath);
}
/// <summary>
/// 保存数据到xml
/// </summary>
/// <param name="persons"></param>
public void SaveToXml(List<Person> persons)
{
foreach (Person person in persons)
{
if (xElement.Elements().Count() > 0 && xElement.Elements().Where(p => p.Element("name").Value == person.name).Count() == 0)
{
xElement.Add(new XElement("person",
new XAttribute("id", (xElement.Elements().Count() + 1)),
new XElement("name", person.name),
new XElement("age", person.age))
);
}
else if (xElement.Elements().Count() == 0)
{
xElement.Add(new XElement("person",
new XAttribute("id", 1),
new XElement("name", person.name),
new XElement("age", person.age))
);
}
else
{
//同一name值 节点已经存在
}
}
xElement.Save(xmlPath);
}
/// <summary>
/// 修改xml文件指定节点数据
/// </summary>
/// <param name="person"></param>
public void UpdateToXml(Person person)
{
List<XElement> list = xElement.Elements().ToList<XElement>();
foreach (var item in list)
{
if (person.id.ToString().Equals(item.Attribute("id").Value))
{
xElement.Add(new XElement("person", new XAttribute("id", person.id),
new XElement("name", string.IsNullOrEmpty(person.name) ? item.Element("name").Value : person.name),
new XElement("age", person.age == 0 ? Convert.ToInt32(item.Element("age").Value ?? "1") : person.age)));
item.Remove();
break;
}
}
xElement.Save(xmlPath);
}
/// <summary>
/// 删除节点
/// </summary>
/// <param name="id"></param>
public void DeleteToXml(int id)
{
xElement.Elements().First(p => p.Attribute("id").Value.Equals(id.ToString())).Remove();
xElement.Save(xmlPath);
}
/// <summary>
/// 查找xml数据
/// </summary>
/// <param name="predicate">委托(lamda)表达式筛选</param>
/// <returns></returns>
public List<Person> SelectToXml(Func<XElement, bool> predicate)
{
IEnumerable<XElement> xelements = xElement.Elements().Where(predicate);
List<Person> persons = null;
if (xelements.Count() > 0)
{
persons = new List<Person>();
foreach (XElement xelement in xelements)
{
persons.Add(new Person()
{
id = Convert.ToInt32(xelement.Attribute("id").Value),
name = xelement.Element("name").Value,
age = Convert.ToInt32(xelement.Element("age").Value)
});
}
}
return persons;
}
}
数据实体类:
public class Person
{
public int id { set; get; }
public string name { set; get; }
public int age { set; get; }
public string ToString()
{
return this.id + " " + this.name + " " + this.age;
}
}
操作例子:
class Program
{
static void Main(string[] args)
{
//Linq to Xml CURD
//xml 文件路径
string xmlFile = Environment.CurrentDirectory + "\\person.xml";
//实例化xml操作类
XMLService xml = new XMLService();
//加载xml文件
xml.Load(xmlFile);
//添加节点(以List集合方式添加,一次可添加多个节点,其中id属性自增)
xml.SaveToXml(new List<Person>() {
new Person() { name = "hello", age = 20 },
new Person() { name = "world", age = 20 }
});
//修改节点,(根据节点属性id值进行修改,将需要修改的属性值进行赋值,否则将保持原来值不变)
xml.UpdateToXml(new Person() { id = 1, name = "new name" });
//删除节点(删除id属性值为1的节点)
xml.DeleteToXml(1);
//根据条件获取xml数据(id属性值大于2将被筛选返回)
List<Person> list = xml.SelectToXml(p => Convert.ToInt32(p.Attribute("id").Value) > 2);
Console.ReadLine();
}
}