[英]Linq to XML Subquery
我有以下XML:
<Event ID="1"..... >
<SubEvent update="DATETIME" />
<SubEvent update="DATETIME" />
<SubEvent update="DATETIME" />
<SubEvent update="DATETIME" />
<SubEvent update="DATETIME" />
<SubEvent update="DATETIME" />
</Event>
<Event ID="2"..... >
<SubEvent update="DATETIME" />
<SubEvent update="DATETIME" />
<SubEvent update="DATETIME" />
<SubEvent update="DATETIME" />
<SubEvent update="DATETIME" />
<SubEvent update="DATETIME" />
</Event>
<Event ID="3"..... >
<SubEvent update="DATETIME" />
<SubEvent update="DATETIME" />
<SubEvent update="DATETIME" />
<SubEvent update="DATETIME" />
<SubEvent update="DATETIME" />
<SubEvent update="DATETIME" />
</Event>
我想刪除“事件”元素,其中SubEvent中的ALL更新屬性低於提供的DATETIME。
例如,如果一個DATETIME更高,則不應刪除該元素。
只需選擇所有這些事件並從文檔中刪除它們:
DateTime date = DateTime.Now;
XDocument xdoc = XDocument.Load(path_to_xml);
xdoc.Descendants("Event")
.Where(e => e.Elements().All(se => (DateTime)se.Attribute("update") < date))
.Remove();
xdoc.Save(path_to_xml);
適用於以下xml:
<?xml version="1.0" encoding="utf-8" ?>
<Events>
<Event ID="1" >
<SubEvent update="2013-02-05T17:06:23.8962976+03:00" />
<SubEvent update="2013-03-08T17:06:23.8962976+03:00" />
</Event>
<Event ID="2">
<SubEvent update="2013-01-05T17:06:23.8962976+03:00" />
<SubEvent update="2013-01-05T17:06:23.8962976+03:00" />
<SubEvent update="2013-02-05T17:06:23.8962976+03:00" />
</Event>
<Event ID="3">
<SubEvent update="2013-03-05T17:06:23.8962976+03:00" />
<SubEvent update="2013-04-05T17:06:23.8962976+03:00" />
</Event>
</Events>
假設您沒有錯過xml的根
var xDoc = // your XDocument
var toDel = new List<XElement>();
foreach(var el in xDoc.Root.Elements("Event").Where(e => e.Elements("SubEvent").All(xel => xel.Attribute("update").Value == "DATETIME")))
{
toDel.Add(el);
}
toDel.ForEach(e => e.Remove());
你必須將.All()
內的條件替換為理想的。
嘗試這個:
var doc = XDocument.Load(@"D:\input.xml");
var x = new List<XElement>();
foreach (var xElement in doc.Root.Elements("Event"))
{
DateTime maxDt = DateTime.MinValue;
foreach (var element in xElement.Elements("SubEvent"))
{
var attributeValue = element.Attributes("update").FirstOrDefault();
if (attributeValue == null) continue;
DateTime dt;
if (!DateTime.TryParse(attributeValue.Value, out dt)) continue;
if (maxDt < dt) maxDt = dt;
}
xElement.RemoveNodes();
xElement.Add(new XElement("SubEvent", new XAttribute("update", maxDt.ToString("yyyy-MM-dd HH:mm:ss"))));
x.Add(new XElement(xElement));
}
new XDocument(new XElement("ev", x)).Save(@"D:\output.xml");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.