Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.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_Linq To Xml_Ienumerable - Fatal编程技术网

C# LINQ到XML:根据其他值选择有条件的值

C# LINQ到XML:根据其他值选择有条件的值,c#,xml,linq,linq-to-xml,ienumerable,C#,Xml,Linq,Linq To Xml,Ienumerable,在下面的XML示例中,可以有许多元素条目。对于每个元素,只能有一个系统条目,但在同一元素中,该系统条目旁边可以有多个设备条目 我想知道,对于每个元素,如何在C中构造一个LINQ到XML查询,该查询可以选择以下数据: 对于系统包含1A7的每个元素,仅返回那些设备InfoB设置名称值,这些值的设备InfoA核心值也为FALSE,然后将这些匹配值放入列表中 在过去的一周里,LINQ对我来说是非常困难的。我没有发布任何代码片段,因为我认为我处理过的大量代码片段中没有一个比上面的查询大纲更能澄清这个问题。

在下面的XML示例中,可以有许多元素条目。对于每个元素,只能有一个系统条目,但在同一元素中,该系统条目旁边可以有多个设备条目

我想知道,对于每个元素,如何在C中构造一个LINQ到XML查询,该查询可以选择以下数据:

对于系统包含1A7的每个元素,仅返回那些设备InfoB设置名称值,这些值的设备InfoA核心值也为FALSE,然后将这些匹配值放入列表中

在过去的一周里,LINQ对我来说是非常困难的。我没有发布任何代码片段,因为我认为我处理过的大量代码片段中没有一个比上面的查询大纲更能澄清这个问题。我非常感谢您在这方面提供的帮助,我希望上面的查询对于这里的LINQtoXML专家来说相当简单

XML:


返回IEnumerable。调用ToString以获取具有具体化结果的列表。

我将在visual basic中执行此操作,因为它本机支持xml内嵌,但转换非常简单

Dim elements = From e In xml...<Element>
               Where e.<System>.<Id>.Value.Contains("1A7")
               Select e
Dim deviceBs = (From e In elements
               Where e.<Device>.<InfoA>.<Core>.Value = "FALSE"
               Select e.<Device>.<InfoB>.<name>.Value).ToList

好的,请发布一段您当前拥有的代码片段。即使这是完全错误的,但这是一个比什么都没有更好的起点。我也非常欣赏这个答案,因为我目前正试图了解各种LINX到XML技术,所以很高兴看到这两种不同且优秀的方法能够起作用。我在5分钟内从你和Marcin的答案中学到了更多,这是我从一周的其他StackOverflow搜索中学到的,所以这对我今天在5到6个基于这些答案的查询中已经非常有用了。谢谢,谢谢你。这可能是一个离题的话题,因为它是VB,但由于这个问题在C的线程中已经回答了两次,那么我认为,看看如何在VB中实现它真的很有趣,如果它在F、IronPython等中可行,那将是非常好的。如果在C语言中有其他的变体语法方法可以做到这一点,那也会很吸引人。
var doc = XDocument.Load("Input.xml");

var values = from e in doc.Root.Elements("Element")
             where ((string)e.Element("System").Element("id")).Contains("1A7")
             from d in e.Elements("Device")
             where !(bool)d.Element("InfoA").Element("Core")
             select (string)d.Element("InfoB").Element("Settings").Element("name");
Dim elements = From e In xml...<Element>
               Where e.<System>.<Id>.Value.Contains("1A7")
               Select e
Dim deviceBs = (From e In elements
               Where e.<Device>.<InfoA>.<Core>.Value = "FALSE"
               Select e.<Device>.<InfoB>.<name>.Value).ToList
XDocument xDoc = XDocument.Load("System.xml"); 
List<string> result = xDoc.Descendants("Element").Where(el => el.Element("System").Element("id").Value.Contains("1A7")).SelectMany(e => e.Descendants("Device").Where(d => d.Element("InfoA").Element("Core").Value.ToUpper() == "FALSE").Select(x => x.Element("InfoB").Element("Settings").Element("name").Value)).ToList();