2016-09-15 91 views
2

我需要关于如何基于时间戳“自动”删除节点的帮助。一个特定的日期是由用户在xml文档中定义的,例如, 17/9/2006 有人可以给我一个例子吗? 在此先感谢!XML根据时间戳删除节点C#

<root> 
    <element> 
    </element> 
    <timestamp time="2016-09-16T13:45:30"> 
    </timestamp> 
    <--how do I delete element based on the given timestamp?--> 
    </root> 

    //UNTESTED CODE 

    XDocument doc = XDocument.Load("time.xml"); 
    var name = doc.Descendants("root") 
     .Where(n => n.Attribute("time").Value == "2016-09-16T13:45:30") 
     .Select(n => (string)n) 
     .First(); 
     <--how can I delete it based on timestamp--> 
     name.Element("element").Remove(); 
+0

这是无效的xml。时间戳节点应该有一个属性,其值是您的实际时间戳。 – kall2sollies

+0

您的意思是标准的日期时间格式,但是以上只是一个演示xml。 – user46000

+0

由于你的xml现在是有效的,你确切的问题是什么?解析XML并识别节点,或解析ISO日期格式? – kall2sollies

回答

2

让我们假设您想与DateTime变量inputDate进行比较。

// I have formatted yor XML and structured it. "root" is the the parent node. Elements are the child elements of root consisting of timestamp tag. 

string xmlInput = @" 
<root> 
<element> 
<timestamp time='2016-09-16T13:45:30'> 
</timestamp> 
</element> 
<element> 
<timestamp time='2016-10-16T13:45:30'> 
</timestamp> 
</element> 
</root>"; 

    XDocument xdoc = XDocument.Parse(xmlInput); 
    xdoc.Descendants("root").Elements("element"). 
          Where(x => DateTime.Compare(DateTime.Parse(x.Element("timestamp").Attribute("time").Value,null, DateTimeStyles.RoundtripKind).Date, inputDate.Date) ==0). 
          ToList().ForEach(x => x.Remove()); 

我比较与inputdate每个元素只有日期,而不是时间的平等XML日期timestamp。你可以有任何你想要的条件。

注意:您需要引用System.Globalization;

using System.Globalization; 
using System.Xml.Linq; 
using System.Xml; 
using System.Linq; 
+0

非常感谢! – user46000

3

解析ISO 8601的日期/时间的格式:

string input = "2016-09-16T13:45:30"; 
DateTime converted = DateTime.Parse(input, null, DateTimeStyles.RoundtripKind); 

一旦转换为DateTime类型的时间,就可以使用它识别要删除的节点(并使用LINQ因为这是高度推荐的)。

+0

感谢您的回复。我更新了我的代码。所以我会比较“转换”与时间属性? – user46000

+0

当您解析XML时,您将使用我提供的代码片段将time属性(它是string类型)转换为DateTime,并将此DateTime与用于决定节点是否应删除的DateTime进行比较。 – kall2sollies