LINQ - 未从 XML 文件中删除指定的元素
LINQ - Specified elements not being removed from XML file
我有一个 XML 文件:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!--QTabs Data Storage-->
<SyncTimes>
<LastSyncTime>
<id>1</id>
<SyncTime>3/31/2015 2:03:28 PM</SyncTime>
</LastSyncTime>
<LastSyncTime>
<id>2</id>
<SyncTime>3/31/2015 2:14:24 PM</SyncTime>
</LastSyncTime>
<LastSyncTime>
<id>3</id>
<SyncTime>3/31/2015 2:14:25 PM</SyncTime>
</LastSyncTime>
<LastSyncTime>
<id>4</id>
<SyncTime>3/31/2015 2:14:26 PM</SyncTime>
</LastSyncTime>
</SyncTimes>
以上时间都是今天早些时候我想删除当前时间(DateTime.Now)之前的所有LastSyncTime记录:
public async void deleteArchivedSyncs()
{
var xElement = (from element in XMLDocObject.Elements("LastSyncTime")
where Convert.ToDateTime(element.Element("SyncTime").Value) < DateTime.Now
select element);
xElement.Remove();
storageFile = await storageFolder.GetFileAsync(Settings.xmlFile);
using (Stream fileStream = await storageFile.OpenStreamForWriteAsync())
{
XMLDocObject.Save(fileStream);
}
}
这 运行 不会影响 XML 页面。没有删除所需的元素。我做错了什么?
这里的问题似乎是删除子项的唯一方法是让父项进行删除,如:
class Program
{
public static void Main(params string[] args)
{
// test.xml contains OPs example content.
var xdoc = XDocument.Load(@"c:\temp\test.xml");
xdoc.Descendants("LastSyncTime")
.Where(e => Convert.ToDateTime(e.Element("SyncTime").Value) < DateTime.Now)
.Remove();
Console.WriteLine(xdoc);
xdoc.Save(@"c:\temp\test_filtered.xml");
}
}
这会生成以下输出:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!--QTabs Data Storage-->
<SyncTimes />
即鉴于所有日期都小于 DateTime.Now
.
,这是可以预期的空根
@DavidTunnell 包含您需要的一切的根 xml 元素是什么?例如:
//let's call the variable you use as Xdocument doc.
XmlNodeList nodes = doc.SelectNodes("LastSyncTime");
for (int i = nodes.Count - 1; i >= 0; i--)
{
nodes[i].ParentNode.RemoveChild(nodes[i]);
}
doc.Save(path);
我就是这样使用的,希望对你有帮助。
我有一个 XML 文件:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!--QTabs Data Storage-->
<SyncTimes>
<LastSyncTime>
<id>1</id>
<SyncTime>3/31/2015 2:03:28 PM</SyncTime>
</LastSyncTime>
<LastSyncTime>
<id>2</id>
<SyncTime>3/31/2015 2:14:24 PM</SyncTime>
</LastSyncTime>
<LastSyncTime>
<id>3</id>
<SyncTime>3/31/2015 2:14:25 PM</SyncTime>
</LastSyncTime>
<LastSyncTime>
<id>4</id>
<SyncTime>3/31/2015 2:14:26 PM</SyncTime>
</LastSyncTime>
</SyncTimes>
以上时间都是今天早些时候我想删除当前时间(DateTime.Now)之前的所有LastSyncTime记录:
public async void deleteArchivedSyncs()
{
var xElement = (from element in XMLDocObject.Elements("LastSyncTime")
where Convert.ToDateTime(element.Element("SyncTime").Value) < DateTime.Now
select element);
xElement.Remove();
storageFile = await storageFolder.GetFileAsync(Settings.xmlFile);
using (Stream fileStream = await storageFile.OpenStreamForWriteAsync())
{
XMLDocObject.Save(fileStream);
}
}
这 运行 不会影响 XML 页面。没有删除所需的元素。我做错了什么?
这里的问题似乎是删除子项的唯一方法是让父项进行删除,如:
class Program
{
public static void Main(params string[] args)
{
// test.xml contains OPs example content.
var xdoc = XDocument.Load(@"c:\temp\test.xml");
xdoc.Descendants("LastSyncTime")
.Where(e => Convert.ToDateTime(e.Element("SyncTime").Value) < DateTime.Now)
.Remove();
Console.WriteLine(xdoc);
xdoc.Save(@"c:\temp\test_filtered.xml");
}
}
这会生成以下输出:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!--QTabs Data Storage-->
<SyncTimes />
即鉴于所有日期都小于 DateTime.Now
.
@DavidTunnell 包含您需要的一切的根 xml 元素是什么?例如:
//let's call the variable you use as Xdocument doc.
XmlNodeList nodes = doc.SelectNodes("LastSyncTime");
for (int i = nodes.Count - 1; i >= 0; i--)
{
nodes[i].ParentNode.RemoveChild(nodes[i]);
}
doc.Save(path);
我就是这样使用的,希望对你有帮助。