【发布时间】:2018-03-16 14:41:15
【问题描述】:
我编写了一些 UWP 应用程序。我想在 XML 列表中保存/更新/删除。我的 XML 列表如下所示:
<?xml version="1.0" encoding="utf-8"?>
<rootnode>
<Kunde Name="Testkunde" />
<Kunde Name="Testkunde2" />
</rootnode>
如果我想使用此代码删除项目
StorageFolder folder = await StorageFolder.GetFolderFromPathAsync(@"C:\Users\IT\source\repos\App3\App3");
StorageFile file = await folder.GetFileAsync("Kundenliste.xml");
using (IRandomAccessStream writeStream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
Stream s = writeStream.AsStreamForWrite();
XDocument doc = XDocument.Load(s);
var q = from node in doc.Descendants("Kunde")
let attr = node.Attribute("Name")
where attr != null && attr.Value == "Testkunde"
select node;
q.ToList().ForEach(x => x.Remove());
doc.Save(s);
}
发生这种情况
<?xml version="1.0" encoding="utf-8"?>
<rootnode>
<Kunde Name="Testkunde" />
<Kunde Name="Testkunde2" />
</rootnode><?xml version="1.0" encoding="utf-8"?>
<rootnode>
<Kunde Name="Testkunde2" />
</rootnode>
谁能帮帮我?
【问题讨论】:
-
在写
doc之前,你需要倒带Stream并清除它的内容,例如通过做s.Position = 0; s.SetLength(0)。参见例如FileMode.Open and FileMode.OpenOrCreate difference when file exists? c# bug? 用于常规 .Net 中的类似错误。我不确定IRandomAccessStream.AsStreamForWrite();返回的流是否可以重新定位和截断。 -
或者,为了安全起见,您可以写入一个单独的文件,然后执行
MoveAndReplaceAsync(Windows.Storage.IStorageFile)。