Linq to XML 增、删、改、查

XML的操作不同于数据库,但是也可以通过Linq来达到效果,效果还是很不错的,只是在查询的时候时刻要有XML结构在脑中,不然真的很容易糊涂。

 

            var data = new[]{
                new {PetName="Melvin",ID=10},
                new {PetName="Pat",ID=11},
                new {PetName="Danny",ID=12},
                new {PetName="Clunker",ID=13}
            };
            XElement vehicles =
                new XElement("Inventory",
                    from c in data
                    where c.ID > 11
                    select new XElement("Car",
                        new XAttribute("ID", c.ID),
                        new XElement("PetName", c.PetName)
                        )
                        );
            Console.WriteLine(vehicles);

 

这是一种在已有的XML中通过查询得到新的XML的方式,构建时方法很灵活,new什么都可以。

 

元素增加

            XElement newPeople =
                new XElement("Contact",
                    new XAttribute("ID", "4"),
                        new XElement("Name", "Tom Good"),
                        new XElement("Phone", "801-867-0679",
                            new XAttribute("Type", "Work")),
                        new XElement("Phone", "801-754-4578",
                            new XAttribute("Type", "Fax")),
                        new XElement("Address",
                            new XElement("Street1", "He Qin st"),
                            new XElement("City", "Beijing"),
                            new XElement("State", "FDSF"),
                            new XElement("Postal", "985453")));
            contacts.Add(newPeople);
            Console.WriteLine(contacts);
            contacts.Save("c://2.xml");

 

元素删除

            XElement myElement = XElement.Load("c://2.xml");
            var results = from r in myElement.Elements()
                          where (string)r.Attribute("ID") == "4"
                          select r;
            foreach (var r in results)
            {
                r.Remove();
            }
            myElement.Save("c://2.xml");

 

元素修改

            XElement myElement = XElement.Load("c://2.xml");
            var results = from r in myElement.Elements()
                          where (string)r.Attribute("ID") == "4"
                          select r;
            foreach (var r in results)
            {
                r.Element("Name").SetValue("Handsome Guy");
            }
            myElement.Save("c://2.xml");

 

元素查询

            XElement myElement = XElement.Load("c://2.xml");
            var results = from r in myElement.Elements()
                          where (string)r.Attribute("ID") == "4"
                          select r;
            foreach (var r in results)
            {
                Console.WriteLine(r.Element("Name").Value);
            }

 

这里想提一点,原本我一直为查询出来的var是否是新开辟的内存单元而犯难,因为不清楚查询出来的内存地址是否还是原先数据源的内存地址决定着修改是否起效的关键,如果查询出的结果是保存在新的内存单元中的,那么无论你怎么修改都不会影响到原来的数据,这样在修改数据时就要做好多其他的工作。还好,实验下来发现,查询出的变量指向还是原先的数据源,终于松了口气。

 

属性 增加

            XElement myELement = XElement.Load("c://2.xml");
            var results = from r in myELement.Elements()
                          where (string)r.Attribute("ID") == "4"
                          select r;
            foreach (var r in results)
            {
                r.SetAttributeValue("Sex", "Male");
            }
            myELement.Save("c://2.xml");

 

属性 删除

            XElement myELement = XElement.Load("c://2.xml");
            var results = from r in myELement.Elements()
                          where (string)r.Attribute("ID") == "4"
                          select r;
            foreach (var r in results)
            {
                r.SetAttributeValue("Name", null);
            }
            myELement.Save("c://2.xml");

 

属性 修改

            XElement myElement = XElement.Load("c://2.xml");
            var results = from r in myElement.Elements()
                          where (string)r.Attribute("ID") == "4"
                          select r;
            foreach (var r in results)
            {
                r.Element("Phone").SetAttributeValue("Type", "Family");
            }
            myElement.Save("c://2.xml");

 

属性 查询

            XElement myELement = XElement.Load("c://2.xml");
            var results = from r in myELement.Elements()
                          where (string)r.Attribute("ID") == "4"
                          select r;
            foreach (var r in results)
            {
                string str = r.Element("Phone").Attribute("Type").Value;
                Console.WriteLine(str);
            }

 

这里又牵扯到一点,在XML中如果没有重名的元素、属性,直接调用Value就可以获得值

如果有重名的,调用的会是第一个该元素,所以在其中还应该做判断,原本想找方便的方法,但是后来还旱死老老实实的判断吧……

 

            XElement myElement = XElement.Load("c://2.xml");
            var results = from r in myElement.Elements()
                          where (string)r.Attribute("ID") == "4"
                          select r;
            foreach (var r in results)
            {
                foreach (var rr in r.Elements())
                {
                    if (rr.Name == "Phone" && rr.Attribute("Type").Value == "Fax")
                    {
                        /*foreach (var rrr in rr.Attributes())
                        {
                            if (rrr.Name == "Type" && rrr.Value == "Fax")
                            {
                                rrr.SetValue("Hello");
                            }
                        }*/
                        rr.SetAttributeValue("Type", "Greate");
                    }
                }
            }
            myElement.Save("c://2.xml");

 

查询得到了XElement的子集,然后在其属性中查找判断rr.Name == "Phone" && rr.Attribute("Type").Value == "Fax",满足要求后在将其rr.SetAttributeValue("Type", "Greate");

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值