.net Linq to Xml (CURD)操作

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

}

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值