繁体   English   中英

Linq to XML Subquery

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM