【问题标题】:How do I neatly remove nodes from an XDocument using LINQ and Lambda?如何使用 LINQ 和 Lambda 从 XDocument 中巧妙地删除节点?
【发布时间】:2010-07-07 12:22:49
【问题描述】:

最优雅的方法是什么:

<?xml version="1.0" encoding="UTF-8"?>
<foo>
<bar baz="wii" date="2009-01-01">
    <baz value="0" />
    <baz value="1" />
</bar>
<bar baz="wii" date="2009-01-02">
    <baz value="0" />
    <baz value="1" />
</bar>
<bar baz="xbox" date="2009-01-01">
    <baz value="0" />
    <baz value="1" />
</bar>
<bar baz="xbox" date="2009-01-02">
    <baz value="0" />
    <baz value="1" />
</bar>
</foo>

到这里:

<foo>
<bar baz="wii" date="2009-01-02">
    <baz value="0" />
    <baz value="1" />
</bar>
<bar baz="xbox" date="2009-01-02">
    <baz value="0" />
    <baz value="1" />
</bar>
</foo>

理想情况下,这是一个带有“日期”参数的函数。 &lt;foo/&gt; 的明显创建和循环以从返回 IEnumerable&lt;XElement&gt; 的表达式中添加每个 &lt;bar&gt; 似乎很笨拙,因此可能有更好的方法。

【问题讨论】:

    标签: lambda linq-to-xml


    【解决方案1】:

    我认为你描述的显而易见的方式实际上是最好的。纯 LINQ 方法可能看起来像

    private static XDocument FilterByDate(XDocument doc, DateTime dateTime)
    {
        return doc.Root.Elements()
                        .Where(xe => DateTime.Parse(xe.Attribute("date").Value) == dateTime)
                        .Aggregate(new XDocument(new XElement("foo")),
                                                (xd, xe) => { xd.Root.Add(xe); return xd; });
    }
    

    但我认为 Aggregate 部分效率不高。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-09
      • 2015-04-09
      • 2014-08-02
      • 2015-03-11
      相关资源
      最近更新 更多