我有这个XML:
<states>
<state name="Alaska" colour="#6D7B8D">
<Location Name="loc1">
<Address>a1</Address>
<DateNTime>a2</DateNTime>
</Location>
<Location Name="loc2">
<Address>b1</Address>
<DateNTime>b2</DateNTime>
</Location>
</state>
<state name="Wyoming" colour="#6D7B8D">
<Location Name="loc3">
<Address>c1</Address>
<DateNTime>c2</DateNTime>
</Location>
<Location Name="loc4">
<Address>d1</Address>
<DateNTime>d2</DateNTime>
</Location>
</state>
</states>
我需要添加/删除州的位置。我该怎么做呢?任何人都可以解释使用Linq的例子吗?
答案 0 :(得分:3)
Linq不处理插入或删除。
但是你可以使用XLinq库。
var doc = XDocument.Load(fileName); // or .Parse(xmlText);
var alaska = doc.Root.Elements("state")
.Where(e => e.Attribute("name").Value == "Alaska").First();
alaska.Add(new XElement("Location", new XAttribute("Name", "someName"),
new XElement("Address", ...)));
答案 1 :(得分:2)
要添加节点,请搜索要添加的父元素,创建要添加的元素,然后添加它。
要删除节点,请搜索要删除的节点,然后将其删除。
// load the xml
var doc = XDocument.Load(@"C:\path\to\file.xml");
// add a new location to "Alaska"
var parent = doc.Descendants("state")
.Where(e => (string)e.Attribute("name") == "Alaska")
.SingleOrDefault();
if (parent != null)
{
// create a new location node
var location =
new XElement("Location",
new XAttribute("Name", "loc5"),
new XElement("Address", "e1"),
new XElement("DateNTime", "e2")
);
// add it
parent.Add(location);
}
// remove a location from "Wyoming"
var wyoming = doc.Descendants("state")
.Where(e => (string)e.Attribute("name") == "Wyoming")
.SingleOrDefault();
if (wyoming != null)
{
// remove "loc4"
wyoming.Elements(e => (string)e.Attribute("Name") == "loc4")
.Remove();
}
// save back to the file
doc.Save(pathToFile);
答案 2 :(得分:1)
这是一个如何做你要求的例子:
XElement doc = XElement.Parse("<states><state name=\"Alaska\" colour=\"#6D7B8D\"><Location Name=\"loc1\"> <Address>a1</Address> <DateNTime>a2</DateNTime></Location><Location Name=\"loc2\"> <Address>b1</Address> <DateNTime>b2</DateNTime></Location></state><state name=\"Wyoming\" colour=\"#6D7B8D\"><Location Name=\"loc3\"> <Address>c1</Address> <DateNTime>c2</DateNTime></Location><Location Name=\"loc4\"> <Address>d1</Address> <DateNTime>d2</DateNTime></Location></state></states>");
doc.Elements("state")
.Where(s => s.Attribute("name").Value == "Alaska").Elements("Location")
.Where(l => l.Attribute("Name").Value == "loc1")
.First()
.Remove();