【问题标题】:Linq to convert collection of objects with xml properties to collection of objects representing xml elements?Linq 将具有 xml 属性的对象集合转换为表示 xml 元素的对象集合?
【发布时间】:2012-08-13 21:07:05
【问题描述】:

我有一个IEnumerable<Item>,其中 Item 有一个名为“widgets”的属性,其中包含 xml 作为字符串。 xml 包含每个小部件的元素,每个小部件可以包含一个名为“foo”的可选元素。例如:

<widgets>
    <widget code="A">
        <foo>1</foo>
    </widget>
    <widget code="B" />
</widgets>

我可以将IEnumerable&lt;Item&gt; 展平为代表小部件的匿名类型的 IEnumerable 吗?

【问题讨论】:

  • 那么,您是说获取IEnumerable&lt;Item&gt; 的每个元素,并返回一个新的IEnumerable&lt;a'&gt;,其中包含来自XML 的所有&lt;widget /&gt; 元素作为不同的项目?
  • 是的,理想情况下,我还希望从项目的属性中填充匿名类型的几个属性。
  • 您是否正在寻找类似 @​​987654327@ 的东西,其中 Widget 和 Foos 是 IEnumerable 包含从 Xml 检索到的值,或者是 select new { ItemName = item.Name, WidgetXmlElements = widgetXmlElements },其中 WidgetXmlElements 是 IEnumerable 派生自小部件元素?

标签: c# linq linq-to-xml linq-to-objects


【解决方案1】:

我不确定foo 是否可以是重复元素,但在这种情况下,它作为Enumerable&lt;String&gt; 返回,这很容易更改。

设置(这里有两个项目,同Widgets XML):

public class Item
{
    public string Name;
    public string Widgets;
}

var xml = "<widgets>\r\n    <widget code=\"A\">\r\n        <foo>1</foo>\r\n    </widget>\r\n    <widge" +
"t code=\"B\" />\r\n</widgets>";

var item1 = new Item {Name = "I1", Widgets = xml};
var item2 = new Item {Name = "I2", Widgets = xml};
var items = new Item[] {item1, item2}.AsEnumerable();

小部件选择过程:

var widgets = 
    from item in items
    from widget in XElement.Parse(item.Widgets).Elements("widget")
    select new {
        Name = item.Name,
        Code = widget.Attribute("code").Value,
        Foo = widget.Elements("foo").Select(f => f.Value)
    };

这为您提供了 4 个项目(I1 A、I1 B、I2 A、I2 B),其中名称(来自项目)和代码和 Foo(来自 XML)设置正确。

如果您希望foo 成为单个元素,则更改如下(基本上设置FirstOrDefault),当foo 不在时,将为您提供空值:

var widgets = 
    from item in items
    from widget in XElement.Parse(item.Widgets).Elements("widget")
    select new {
        Name = item.Name,
        Code = widget.Attribute("code").Value,
        Foo = widget.Elements("foo").Select(f => f.Value).FirstOrDefault()
    };

【讨论】:

    猜你喜欢
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 2022-11-28
    • 2018-08-07
    相关资源
    最近更新 更多