Linq к Xml: выбор элементов, если значение атрибута равняется значению узла в IEnumerable <XElement>

Я бы посоветовал использовать навигационные устройства: https://router.vuejs.org/guide/advanced/navigation-guards.html#per-route-guard

Пример:

const router = new VueRouter({
  routes: [
    {
      path: '/foo',
      component: Foo,
      beforeEnter: (to, from, next) => {
        if (!isLoggedIn()) {
          next({
            path: '/login'
          })
        } else {
          next()
        }
      }
    }
  ]
})

8
задан lolcat 22 February 2009 в 06:05
поделиться

1 ответ

Одна проблема, которую я вижу, то, что в последнем фрагменте кода, ...Elements("userid") возвращает список объектов XElement, которые не могут содержать Строку, возвращенную свойством Value. Это должно работать...

IEnumerable<XElement> rosters = obRoot.Elements("rosterlist").Elements("roster");
var rosterUserIds = (rosters.Elements("userid").Select(r => r.Value));
IEnumerable<XElement> users = obRoot.Elements("userlist").Elements("user")
                .Where(u => rosterUserIds.Contains(u.Attribute("userid").Value));

Однако я сделал бы это при помощи запроса соединения.. Выберите пользовательские списки соединения на идентификаторе пользователя
Это прошло бы примерно так

string sXml = @"
<root>
<rosterlist>
    <roster>
        <userid>1</userid>
        <name>R1</name>
        <etc></etc>
    </roster>
    <roster>
        <userid>2</userid>
        <name>R2</name>
        <etc></etc>
    </roster>
</rosterlist>
<userlist>
    <user userid='1'>
        <name>User on roster</name>
    </user>
    <user userid='5'>
        <name>User not on roster</name>
    </user>
</userlist>
</root>

";

XElement obRoot = XElement.Parse( sXml );
var results = from user in obRoot.Elements("userlist").Elements("user")
   join roster in obRoot.Elements("rosterlist").Elements("roster")
   on user.Attribute("userid").Value equals roster.Element("userid").Value
   select new {Name=user.Element("name").Value, RosterName=roster.Element("name").Value} ;

foreach (var v in results)
{
   Console.WriteLine("{0, -20} on Roster {1, -20}", v.Name, v.RosterName);
}

Выводы:

User on roster       on Roster R1
6
ответ дан 5 December 2019 в 22:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: