Select 一个元素作为最后一个 child 与 属性
Select an element who as a last child with property
<bus>
<port>
<req>
<item>
[...]
</item>
</req>
[...]
<req>
<item>
[...]
</item>
</req>
</port>
[...]
<port>
<req>
<item>
[...]
</item>
</req>
[...]
<req>
<item>
[...]
</item>
</req>
</port>
</bus>
<bus>
[...] (same as before)
</bus>
我有这个结构;所有的结构都在重复。我需要 select 总线的最后一个端口元素,它具有最后一个 child 和 属性 "mode"=="read".
它可以存在一个总线,其最后一个端口元素的最后一个 child 与 属性 不同于 "read",所以我需要选择正确的端口元素。
我尝试了很多次,最后一个是这个,但不起作用:
var modbusportSelected = Elements("bus").Elements("port")
.Where( x => x.Elements("req")
.Any(y => y.Attribute("mode").Value.Contains("read")))
.Last();
如有任何帮助,我们将不胜感激;另外,我对 LINQ to XML 完全陌生,我找不到一个网页来获取 "Any" 的确切含义,如果还有其他运算符,如果有,它们是什么。
您的 XML 代码段需要顶级元素可能很重要。如果您将上面的内容包装在外部标记中,那么您的代码似乎可以工作,前提是您从任何没有 mode
属性的 port
元素捕获空引用。例如
using System;
using System.Linq;
using System.Xml.Linq;
namespace ConsoleApp1
{
class Program
{
public static string xml = @"<topLevel><bus>
<port isCorrectNode='no'>
<req>
<item>
</item>
</req>
<req mode='read'>
<item>
</item>
</req>
</port>
<port isCorrectNode='yes'>
<req mode='read'>
<item>
</item>
</req>
<req>
<item>
</item>
</req>
</port>
</bus>
<bus>
</bus>
</topLevel>";
static void Main(string[] args)
{
XElement root = XElement.Parse(xml);
var found = root.Elements("bus").Elements("port")
.Where(x => x.Elements("req").Any(y => y.Attribute("mode") != null && y.Attribute("mode").Value.Contains("read")))
.Last();
var isThisTheCorrectNode = found.Attribute("isCorrectNode").Value;
Console.WriteLine(isThisTheCorrectNode);
}
}
}
会写yes
编辑:我注意到您的代码查找最后一个 port
,它有 any 个子 req
,模式为 'read'。但是你的问题问的是 last 这样的 req
。在那种情况下:
var wanted = root.Elements("bus").Elements("port")
.Where(x => x.Elements("req").Any() && // make sure there is a req element
x.Elements("req").Last().Attribute("mode") != null && // and it has the attribute
x.Elements("req").Last().Attribute("mode").Value.Contains("read")) // and it has the right value
.Last();
<bus>
<port>
<req>
<item>
[...]
</item>
</req>
[...]
<req>
<item>
[...]
</item>
</req>
</port>
[...]
<port>
<req>
<item>
[...]
</item>
</req>
[...]
<req>
<item>
[...]
</item>
</req>
</port>
</bus>
<bus>
[...] (same as before)
</bus>
我有这个结构;所有的结构都在重复。我需要 select 总线的最后一个端口元素,它具有最后一个 child 和 属性 "mode"=="read".
它可以存在一个总线,其最后一个端口元素的最后一个 child 与 属性 不同于 "read",所以我需要选择正确的端口元素。
我尝试了很多次,最后一个是这个,但不起作用:
var modbusportSelected = Elements("bus").Elements("port")
.Where( x => x.Elements("req")
.Any(y => y.Attribute("mode").Value.Contains("read")))
.Last();
如有任何帮助,我们将不胜感激;另外,我对 LINQ to XML 完全陌生,我找不到一个网页来获取 "Any" 的确切含义,如果还有其他运算符,如果有,它们是什么。
您的 XML 代码段需要顶级元素可能很重要。如果您将上面的内容包装在外部标记中,那么您的代码似乎可以工作,前提是您从任何没有 mode
属性的 port
元素捕获空引用。例如
using System;
using System.Linq;
using System.Xml.Linq;
namespace ConsoleApp1
{
class Program
{
public static string xml = @"<topLevel><bus>
<port isCorrectNode='no'>
<req>
<item>
</item>
</req>
<req mode='read'>
<item>
</item>
</req>
</port>
<port isCorrectNode='yes'>
<req mode='read'>
<item>
</item>
</req>
<req>
<item>
</item>
</req>
</port>
</bus>
<bus>
</bus>
</topLevel>";
static void Main(string[] args)
{
XElement root = XElement.Parse(xml);
var found = root.Elements("bus").Elements("port")
.Where(x => x.Elements("req").Any(y => y.Attribute("mode") != null && y.Attribute("mode").Value.Contains("read")))
.Last();
var isThisTheCorrectNode = found.Attribute("isCorrectNode").Value;
Console.WriteLine(isThisTheCorrectNode);
}
}
}
会写yes
编辑:我注意到您的代码查找最后一个 port
,它有 any 个子 req
,模式为 'read'。但是你的问题问的是 last 这样的 req
。在那种情况下:
var wanted = root.Elements("bus").Elements("port")
.Where(x => x.Elements("req").Any() && // make sure there is a req element
x.Elements("req").Last().Attribute("mode") != null && // and it has the attribute
x.Elements("req").Last().Attribute("mode").Value.Contains("read")) // and it has the right value
.Last();