Выберите элемент, который в качестве последнего ребенка со свойством - PullRequest
0 голосов
/ 17 июня 2019
<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>

У меня есть эта структура;все структуры повторяются.Мне нужно выбрать последний элемент порта шины, у которого есть последний дочерний элемент со свойством «mode» == «read».

Может существовать шина, которая имеет последний элемент порта с последним дочерним элементом со свойствомотличается от «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», и если есть другие операторы, и если да, то каковы они.

1 Ответ

2 голосов
/ 17 июня 2019

Может быть важно, что ваш фрагмент XML нуждается в элементе верхнего уровня.Если вы заключите то, что у вас есть выше, во внешний тег, то ваш код будет работать, если вы перехватите нулевые ссылки из любых элементов port, которые не имеют атрибута mode.напр.

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, который имеет любой дочерний reqчей режим «чтение».но ваш вопрос задал для последний такой 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...