Linq to XML 增、删、改、查
2009-12-10 14:01
253 查看
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
4000
.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");
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
4000
.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");
相关文章推荐
- [代码]使用XSD验证XML示例1(LINQ to XML)
- LINQ TO XML(创建XML文档)
- linq to xml(删除)
- Linq To Xml 备忘录3(使用Namespace的查询)
- 使用Dom与Linq to Xml
- 步步为营VS 2008 + .NET 3.5(14) - XLINQ(LINQ to XML)之针对XML文件的添加、查询、更新和删除
- linq to xml操作XML
- LINQ To XML 入门(3)
- 使用Python读取TestTrack记录- Part3 动态生成Linq to xml查询语句筛选条件
- Linq To Xml上手(1) Descendants、Elements遍历节点
- LINQ to XML 简单的小例子
- linq to xml查询绑定GridView
- C#基础精华06(Linq To XML,读取xml文件,写入xml)
- Linq To Xml 创建修改xml文档
- C#新手入门代码 LINQ TO XML xattribute的用法示例
- LINQ TO XML 修改 app.config
- C# 中的默认命名空间的范围 (LINQ to XML)
- Simple example for Linq To XML
- Converting Linq result to XML String