原始XML:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Links>
<Category name="a" />
<Category name="b" />
</Links>
我想删除其属性=“b”的类别节点,并使用以下代码
执行此操作 using (IsolatedStorageFile myStore = IsolatedStorageFile.GetUserStoreForApplication())
{
using (IsolatedStorageFileStream myStream = new IsolatedStorageFileStream(App.FileName, FileMode.Open, FileAccess.ReadWrite, myStore))
{
XElement mainTree = XElement.Load(myStream);
mainTree.Elements("Category").Where(s => s.Attribute("name").Value == "b").DescendantsAndSelf().Remove();
myStream.Position = 0;
mainTree.Save(myStream);
}
}
代码运行后,生成的XML看起来像这样......
<?xml version="1.0" encoding="utf-8"?>
<Links>
<Category name="a" />
</Links>="a" />
<Category name="b" />
</Links>
正如您所看到的那样,XML是Toast,并且IsolatedStorageFileStream阅读器无法读取并出错。
您能否在删除节点时以及将其写回isolatedfilestorage
时告诉我我做错了什么?
答案 0 :(得分:1)
看起来麻烦的是你在不清除它的情况下保存同一文件中的现有数据。您需要完全清除文件或保存到新文件。
在{}中是有效的xml段,除此之外的所有内容都是旧文件。
{<Links>
<Category name="a" />
</Links>}="a" />
<Category name="b" />
</Links>
答案 1 :(得分:1)
您应该尝试在流操作范围之外的代码。例如,如果您运行此:
var mainTree = XDocument.Parse(@"<Links>
<Category name='a' />
<Category name='b' />
</Links>");
mainTree.Elements("Category")
.Where(s => s.Attribute("name").Value == "b")
.DescendantsAndSelf()
.Remove();
Console.WriteLine(mainTree.ToString(SaveOptions.None));
您将看到它再现您的输入。试试这个linq表达式:
mainTree.Root
.Elements("Category")
.Where(s => s.Attribute("name").Value == "b")
.Remove();
我认为你试图找到与“链接”处于同一级别的“类别”元素。您不需要DescendantsAndSelf()调用,当您删除(删除)xml节点时,您将删除所有包含的子节点。
下一个问题是你要覆盖一个文件。您希望在使用较短的内容重写文件之前清除该文件。创建XDocument后,关闭流,运行linq,然后使用Createmode创建并编写xml,再次打开文件。
答案 2 :(得分:0)
扩展先前给出的答案 -
我尝试使用LinqPad进行简单的试用:
var xml = XElement.Parse(@"<?xml version='1.0' encoding='utf-8'?><Links><Category name='a' /><Category name='b' /></Links>");
xml.Elements("Category").Where(s => s.Attribute("name").Value == "b").DescendantsAndSelf().Remove();
Console.WriteLine(xml.ToString());
产生了预期的结果:
<Links>
<Category name="a" />
</Links>
删除后,您需要验证xml的格式是否正确。如果是这种情况,并且在尝试保存时实际发生了否定结果,则问题将是如前所述保存现有数据。