Как использовать синтаксис LINQ, чтобы выбрать из моего XDocument все те XElements, которые имеют определенное значение атрибута? - PullRequest
0 голосов
/ 05 июня 2018

Мне нужно создать новый XDocument на основе другого XDocument, и поэтому я хочу пройтись по всем XElements исходного XDocument, добавляя только те XElements, которые соответствуют определенным критериям, к новому XDocument.

проблема в том, что моя переменная «дубликаты» всегда равна нулю, но она всегда должна содержать хотя бы один элемент, который является текущим на данный момент.

XDocument doc = new XDocument();
XElement rootElement = new XElement("users");
var allElements = originalDoc.Element("users").Elements().Where(e => e.Name.LocalName == "user");
foreach (var xUser in allElements)
{
    var duplicates = originalDoc.Element("users").Elements().Where(e => e.Attribute("Login").Value == "Demo1");
    rootElement.Add(xUser);
}
doc.Add(rootElement);
return doc;

Где originalDoc - это XDocument, каков синтаксис LINQ длявыбрать из моего XDocument в этот момент все те XElements, которые имеют определенное значение атрибута?

Приложение:

Вот как выглядит XML, без пространств имен или каких-либо дополнительных элементов, только корневой элемент иодин уровень подэлементов:

<users>
  <user ProjectName="TheCompany1" ProjectSlug="testName" Login="Demo1" Name="Test user" ActivationState="FullyActivated" Country="" Created="2011-03-04T20:32:04.367" IsCustomUser="false" DeleteFilesOnLogout="false" Email="validation@company.com" IsDefaultLoginUser="true" IsDefaultTestUser="false" IsLockedOut="false" MaxFileSize="300000" PostFileEnabled="true" RestServiceEnabled="false" Salutation=""Groups="Everyone" />
  <user ProjectName="TheCompany2" ProjectSlug="testName" Login="Demo2" Name="Test user" ActivationState="FullyActivated" Country="" Created="2011-03-04T20:32:04.367" IsCustomUser="false" DeleteFilesOnLogout="false" Email="validation@company.com" IsDefaultLoginUser="true" IsDefaultTestUser="false" IsLockedOut="false" MaxFileSize="300000" PostFileEnabled="true" RestServiceEnabled="false" Salutation=""Groups="Everyone" />
  <user ProjectName="TheCompany3" ProjectSlug="testName" Login="Demo3" Name="Test user" ActivationState="FullyActivated" Country="" Created="2011-03-04T20:32:04.367" IsCustomUser="false" DeleteFilesOnLogout="false" Email="validation@company.com" IsDefaultLoginUser="true" IsDefaultTestUser="false" IsLockedOut="false" MaxFileSize="300000" PostFileEnabled="true" RestServiceEnabled="false" Salutation=""Groups="Everyone" />
</users>

1 Ответ

0 голосов
/ 08 июня 2018

Требуются два быстрых исправления!

Прежде всего, фрагмент XML не является правильно сформированным.Ищите « Salutation=""Groups=», которое должно быть « Salutation="" Groups=».

Во-вторых, просто измените ваш запрос немного,

var duplicates = originalDoc.Element("users").Elements().Where(e => e.Attribute("Login").Value=="Demo1");

на этот

var duplicates = originalDoc.Root.Elements().Where(e => e.Attribute("Login").Value=="Demo1");
                           ^^^^^^^

И вы всеготово ... Или вы можете использовать Потомки в противном случае.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...