所以这是我的情况。
我有一个XElement,让我们称之为root,它有后代,后代等等。我使用LINQ to XML拉出一个后代,使用.ToString()
将其加载到备忘录编辑器中并进行编辑。现在我想用编辑后的版本更新/替换原始的后代元素。
让我提一下,这是一个简单的XML文件,没有架构,没有使用DOM等。我只需要能够编辑和更新/替换元素。
这是我的XML模型:
<Root>
<Genre Name="Rock">
<Artist Name="Pink Floyd">
<BandMembers>
<Member>Nick Mason</Member>
<Member>Syd Barret</Member>
<Member>David Gilmour</Member>
<Member>Roger Water</Member>
<Member>Richard Wright</Member>
</BandMembers>
<Category>Favorite band of all time</Category>
</Artist>
<Artist Name="Led Zepelin">
<Category>Love the band</Category>
</Artist>
</Genre>
<Genre Name="Blues">
<Artist Name="Muddy Waters">
<Instrument>Harmonica</Instrument>
</Artist>
<Artist Name="Howling Wolf">
<Instrument>Guitar</Instrument>
</Artist>
</Genre>
</Root>
现在说我想编辑“Pink Floyd”元素来纠正Roger Waters的姓氏。我获取该元素,将其转换为字符串,将其加载到我的编辑器中,进行我想要的更改,然后使用.Parse()
将其转换回XElement。
现在,我如何更新/替换原始XML中的“Pink Floyd”节点?
答案 0 :(得分:14)
您可以使用XNode.ReplaceWith
method:
// input would be your edited XML, this is just sample data to illustrate
string input = @"<Artist Name=""Pink Floyd"">
<BandMembers>
<Member>Nick Mason</Member>
<Member>Syd Barret</Member>
<Member>David Gilmour</Member>
<Member>Roger Waters</Member>
<Member>Richard Wright</Member>
</BandMembers>
<Category>Favorite band of all time</Category>
</Artist>";
var replacement = XElement.Parse(input);
var pinkFloyd = xml.Elements("Genre")
.Where(e => e.Attribute("Name").Value == "Rock")
.Elements("Artist")
.Single(e => e.Attribute("Name").Value == "Pink Floyd");
pinkFloyd.ReplaceWith(replacement);
Console.WriteLine(xml);
您应该添加一些错误检查。我使用Single
,因为我确定该节点存在,但如果有可能不存在,则应使用SingleOrDefault
并在使用结果前检查null
。
此外,如果输入无效,则需要将上述代码包装在try / catch中并处理可能抛出的任何XmlException
。