Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq多个按xml属性选择_C#_Xml_Linq - Fatal编程技术网

C# Linq多个按xml属性选择

C# Linq多个按xml属性选择,c#,xml,linq,C#,Xml,Linq,我想根据元素的属性从xml文件中选择多个新对象: 例如: 这里的问题是,我只能通过以下方式选择第一个元素: cube.Elements+cube.Attributecurrency.Value,因此我希望能够检查多维数据集的所有元素: cube.Elementsns+cube.attributecurrency.Values的复数形式,但不可能像这样。你知道如何制作多个物体吗?我有3个字符串的名称,所以我需要3个不同的对象在这里。它只适用于美元,因为它是第一个对象 我的最终结果应该是X个列表,每

我想根据元素的属性从xml文件中选择多个新对象: 例如:

这里的问题是,我只能通过以下方式选择第一个元素: cube.Elements+cube.Attributecurrency.Value,因此我希望能够检查多维数据集的所有元素: cube.Elementsns+cube.attributecurrency.Values的复数形式,但不可能像这样。你知道如何制作多个物体吗?我有3个字符串的名称,所以我需要3个不同的对象在这里。它只适用于美元,因为它是第一个对象

我的最终结果应该是X个列表,每个列表包含3个对象

XNamespace ns = "http://www.ecb.int/vocabulary/2002-08-01/eurofxref";
var xdoc = XDocument.Load(@"http://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml");
var names = new[] { "USD", "RON", "SMT" };
var someCubes =  xdoc.Root.Element(ns + "Cube")
    .Elements()
    .Select(x => x.Elements()
    .Where(y => names.Contains(y.Attribute("currency").Value)))
    .Select(x => {
        return x.Select(y => {
            return new {
                datum = (DateTime)y.Parent.Attribute("time"),
                currency = (string)y.Attribute("currency"),
                rate = (string)y.Attribute("rate")
            };
        });
    });

这对我来说很好。但是请注意,您链接的XML中没有以ROM或SMT作为货币的元素。RON似乎是有效的,所以我相应地更新了names数组,但我没有看到SMT


这对我来说很好。但是请注意,您链接的XML中没有以ROM或SMT作为货币的元素。RON似乎是有效的,因此我相应地更新了名称数组,但我没有看到SMT。

另一种使用更多查询语法的替代方法:

var Cubes = from cube in XDocument.Load(@"http://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml")
                                  .Root
                                  .Element(ns+"Cube")
                                  .Elements(ns+"Cube")
            select
            (
                from innercube in cube.Elements(ns+"Cube")
                where names.Contains((string)innercube.Attribute("currency"))
                select (object)new
                       {
                           datum = (DateTime)cube.Attribute("time"),
                           currency = (string)innercube.Attribute("currency"),
                           rate = (string)innercube.Attribute("rate")
                       }
            ).ToList();

使用更多查询语法的另一种选择:

var Cubes = from cube in XDocument.Load(@"http://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml")
                                  .Root
                                  .Element(ns+"Cube")
                                  .Elements(ns+"Cube")
            select
            (
                from innercube in cube.Elements(ns+"Cube")
                where names.Contains((string)innercube.Attribute("currency"))
                select (object)new
                       {
                           datum = (DateTime)cube.Attribute("time"),
                           currency = (string)innercube.Attribute("currency"),
                           rate = (string)innercube.Attribute("rate")
                       }
            ).ToList();


您可以发布示例XML吗?它是XDocument.Load中的链接。代码中的ns是什么?它只是名称空间,抱歉,我将添加它now@DENKOMANCHESKI-嘿,但是在你的XML中没有货币属性为ROM或SMT的标记。你能发布示例XML吗?它是XDocument.Load中的链接。代码中的ns是什么?它只是名称空间,抱歉,我将添加它now@DENKOMANCHESKI-嘿,但是在您的XML中没有货币属性为ROM或SMT的标记。我已经更新了我的答案,以包含匿名对象投影。请注意,这将返回一个IEnumerable,因此您可能需要。如果适合您的需要,请列出几个位置。太好了,非常感谢。这正是我所需要的。这是一个使对象投影看起来像这样的插件吗?styled?我正在使用一个名为LinqPad的工具,它允许您执行任意C语句/表达式/程序,而无需在visual studio中创建新项目的所有开销。它增加了转储任何变量的功能,以便您可以查看其中的内容。请注意,在屏幕截图中,我写了一些cubes.Dump,这是生成下半部分的原因,也是我知道其他答案不适合您的需要的原因。非常简单,只需将答案放入LinqPad并调用.Dump即可查看输出。它对我的日常开发非常宝贵,我强烈建议所有的.NET程序员我已经更新了我的答案,包括匿名对象投影。请注意,这将返回一个IEnumerable,因此您可能需要。如果适合您的需要,请列出几个位置。太好了,非常感谢。这正是我所需要的。这是一个使对象投影看起来像这样的插件吗?styled?我正在使用一个名为LinqPad的工具,它允许您执行任意C语句/表达式/程序,而无需在visual studio中创建新项目的所有开销。它增加了转储任何变量的功能,以便您可以查看其中的内容。请注意,在屏幕截图中,我写了一些cubes.Dump,这是生成下半部分的原因,也是我知道其他答案不适合您的需要的原因。非常简单,只需将答案放入LinqPad并调用.Dump即可查看输出。这对我的日常发展来说是非常宝贵的,我强烈建议所有的.NET程序员这仍然不起作用。它创建了许多分隔不同货币的单一项目列表,而不是每个选定货币的3个项目列表。@JesseCarter感谢您的更正,修复了它。现在它返回了正确的IEnumerableNice答案,根据开发人员的背景,查询语法肯定会更友好+1这仍然不起作用。它创建了许多分隔不同货币的单一项目列表,而不是每个选定货币的3个项目列表。@JesseCarter感谢您的更正,修复了它。现在它返回了正确的IEnumerableNice答案,根据开发人员的背景,查询语法肯定会更友好+1.