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();