在C#中删除特定的XML元素及其子元素
本文关键字:元素 XML 删除 | 更新日期: 2023-09-27 17:58:39
假设我有这个XML文件:
<Stops>
<Stop>
<ID>1022</ID>
<UserDescription>Test</UserDescription>
</Stop>
<Stop>
<ID>1053</ID>
<UserDescription>Test1045</UserDescription>
</Stop>
</Stops>
我想删除ID等于一个值的整个节点。
因此,例如删除带有1022的节点应该给出:
<Stops>
<Stop>
<ID>1053</ID>
<UserDescription>Test1045</UserDescription>
</Stop>
</Stops>
到目前为止我一直在尝试的代码(Windows Phone中的C#)。它似乎出现了故障,使XML无法读取。我不知道哪里出了问题。。。
using (isoStore)
{
XDocument doc;
using (IsolatedStorageFileStream isoStream = new IsolatedStorageFileStream(StopFileName, FileMode.Open, isoStore))
{
doc = XDocument.Load(isoStream, LoadOptions.None);
doc.Descendants("Stop")
.Where(x => (string)x.Element("ID") == "1022").Remove();
doc.Save(isoStream);
}
}
我认为您的错误是使用相同的流读取和保存。
如果您查看自己的代码,则可以从文件中加载xml:
doc = XDocument.Load(isoStream, LoadOptions.None);
然后保存到同一个流:
doc.Save(isoStream);
所以您最终得到的XML文件看起来像这个
<Stops>
<Stop>
<ID>1022</ID>
<UserDescription>Test</UserDescription>
</Stop>
<Stop>
<ID>1053</ID>
<UserDescription>Test1045</UserDescription>
</Stop>
</Stops>
<Stops>
<Stop>
<ID>1053</ID>
<UserDescription>Test1045</UserDescription>
</Stop>
</Stops>
有两个根元素确实会导致"意外的XML声明"
我会更改您的代码,以便首先读取文件,然后创建一个新文件/覆盖现有文件。
using (isoStore)
{
XDocument doc;
using (IsolatedStorageFileStream isoStream = new IsolatedStorageFileStream(StopFileName, FileMode.Open, isoStore))
{
doc = XDocument.Load(isoStream, LoadOptions.None);
}
doc.Descendants("Stop")
.Where(x => (string)x.Element("ID") == "1022").Remove();
using (IsolatedStorageFileStream isoStream = new IsolatedStorageFileStream(StopFileName, FileMode.Create, isoStore))
{
doc.Save(isoStream);
}
}